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,38 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "lutaml/model"
|
|
4
|
+
|
|
5
|
+
module Pubid
|
|
6
|
+
module Csa
|
|
7
|
+
# CompositeIdentifier is the base class for identifiers that contain
|
|
8
|
+
# collections of other identifiers or package materials.
|
|
9
|
+
#
|
|
10
|
+
# Examples:
|
|
11
|
+
# - Package: base + package materials
|
|
12
|
+
#
|
|
13
|
+
# This follows the Composite pattern where an identifier can contain
|
|
14
|
+
# other identifiers or additional metadata as a collection.
|
|
15
|
+
class CompositeIdentifier < Identifier
|
|
16
|
+
# The primary/base identifier. A real lutaml attribute under the uniform
|
|
17
|
+
# `base` name, so `#root` walks it and it survives serialization — see
|
|
18
|
+
# WrapperIdentifier#base for why the type is the cross-flavor
|
|
19
|
+
# ::Pubid::Identifier.
|
|
20
|
+
attribute :base, ::Pubid::Identifier, polymorphic: true
|
|
21
|
+
|
|
22
|
+
# Subclasses MUST implement to_s to define how they render
|
|
23
|
+
def to_s(**_opts)
|
|
24
|
+
raise NotImplementedError, "Subclasses must implement to_s method"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# A package peels to the standard it packages — see
|
|
28
|
+
# WrapperIdentifier#base_document.
|
|
29
|
+
def base_document
|
|
30
|
+
base ? base.base_document : self
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def drop_supplements
|
|
34
|
+
base || self
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,570 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Csa
|
|
5
|
+
# Common base class for EVERY CSA identifier — the single-document types
|
|
6
|
+
# through SingleIdentifier, and the container types (WrapperIdentifier,
|
|
7
|
+
# CompositeIdentifier, Bundled, Combined) directly. So every CSA identifier
|
|
8
|
+
# is `is_a?(Pubid::Csa::Identifier)` natively and gets the shared
|
|
9
|
+
# polymorphic `from_hash`, `#root`, `#exclude` and MR rendering. The
|
|
10
|
+
# containers used to be separate Lutaml::Model types, which is what made
|
|
11
|
+
# `root.number` raise rather than return the relaton index key.
|
|
12
|
+
class Identifier < ::Pubid::Identifier
|
|
13
|
+
def self.parse(input)
|
|
14
|
+
unless input.is_a?(String)
|
|
15
|
+
raise Pubid::Errors::InvalidInputError,
|
|
16
|
+
Pubid::INPUT_NOT_A_STRING_MESSAGE
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
if input.length > Pubid::MAX_INPUT_LENGTH
|
|
20
|
+
raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Filter out comments
|
|
24
|
+
if input.start_with?("#")
|
|
25
|
+
raise Pubid::Errors::ParseError.new(
|
|
26
|
+
"Not a CSA identifier (comment): #{input}",
|
|
27
|
+
input: input, flavor: "csa",
|
|
28
|
+
)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Filter out non-standards (memberships, courses, newsletters)
|
|
32
|
+
if input.match?(/^CSA (Communities|Group|Learning|OnDemand|Update)/)
|
|
33
|
+
raise Pubid::Errors::ParseError.new(
|
|
34
|
+
"Not a CSA standard: #{input}", input: input, flavor: "csa"
|
|
35
|
+
)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Preprocessing: normalize CEI to IEC (French name)
|
|
39
|
+
input = input.gsub("CEI/IEC", "IEC").gsub(/\bCEI\b/, "IEC")
|
|
40
|
+
|
|
41
|
+
# Detect CAN/ wrapper (Canadian adoption)
|
|
42
|
+
if input.start_with?("CAN/")
|
|
43
|
+
# Check if this is actually a bundled/combined identifier with + or /
|
|
44
|
+
# that should NOT be wrapped in CanadianAdopted
|
|
45
|
+
wrapped_input = input.sub(/^CAN\//, "")
|
|
46
|
+
|
|
47
|
+
# Check for bundled (+) or combined (/ or ,) patterns that should remain as-is
|
|
48
|
+
# These should be parsed normally, with publisher prefix applied to each part
|
|
49
|
+
# Patterns to detect:
|
|
50
|
+
# 1. Bundled: + separator (e.g., "CSA B127.1:99 + B127.2:99")
|
|
51
|
+
# 2. Combined with space: / separator with space before CSA- (e.g., "CSA A23.1:24/CSA A23.2:24")
|
|
52
|
+
# 3. Combined with CAN/CSA-: / separator with CSA- appearing multiple times (e.g., "CSA-B138.1-17/CSA-B138.2-17")
|
|
53
|
+
if wrapped_input.include?("+") ||
|
|
54
|
+
(wrapped_input.include?("/") && wrapped_input.match?(/\s+CSA-/)) ||
|
|
55
|
+
(wrapped_input.include?("/") && wrapped_input.scan("CSA-").length > 1)
|
|
56
|
+
# This is a bundled or combined identifier - parse normally and add prefix
|
|
57
|
+
# Normalize CSA- to CSA (with space) for parsing
|
|
58
|
+
normalized = wrapped_input.sub(/^CSA-/, "CSA ")
|
|
59
|
+
normalized = normalized.gsub("CAN/CSA-", "CSA ").gsub("CAN3-",
|
|
60
|
+
"CSA ")
|
|
61
|
+
normalized = normalized.gsub(/\s+/, " ").strip
|
|
62
|
+
|
|
63
|
+
# Parse normally (will create Bundled or Combined identifier)
|
|
64
|
+
tree = Parser.new.parse(normalized)
|
|
65
|
+
result = build!(tree, input)
|
|
66
|
+
|
|
67
|
+
# Apply CAN/CSA- prefix to the appropriate parts
|
|
68
|
+
set_publisher_prefix(result, "CAN/CSA-")
|
|
69
|
+
|
|
70
|
+
# Handle reaffirmation if present
|
|
71
|
+
if (wrapped_input =~ /\(R(\d{4})\)/) && result.class.attributes.key?(:reaffirmation)
|
|
72
|
+
result.reaffirmation = $1
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
return result
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# This is a standard single identifier wrapped in CanadianAdopted
|
|
79
|
+
# Remove CAN/ prefix (already done above)
|
|
80
|
+
|
|
81
|
+
# Extract reaffirmation FIRST (before any other processing)
|
|
82
|
+
reaffirm_year = nil
|
|
83
|
+
reaffirmation_was_4digit = false # Track original format
|
|
84
|
+
if wrapped_input =~ /\(R(\d{2,4})\)/
|
|
85
|
+
reaffirm_year = $1
|
|
86
|
+
reaffirmation_was_4digit = ($1.length == 4) # Track if original was 4-digit
|
|
87
|
+
# Convert 2-digit year to 4-digit if needed
|
|
88
|
+
if reaffirm_year.length == 2
|
|
89
|
+
year_int = reaffirm_year.to_i
|
|
90
|
+
reaffirm_year = year_int < 50 ? "20#{reaffirm_year}" : "19#{reaffirm_year}"
|
|
91
|
+
end
|
|
92
|
+
wrapped_input = wrapped_input.sub(/\s*\(R\d{2,4}\)/, "")
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# Detect and preserve original format (CSA- vs CSA)
|
|
96
|
+
# Also track that this is a CAN/CSA- identifier (not just CSA-)
|
|
97
|
+
original_prefix = if wrapped_input.start_with?("CSA-")
|
|
98
|
+
"CSA-"
|
|
99
|
+
elsif wrapped_input.start_with?("CSA ")
|
|
100
|
+
"CSA"
|
|
101
|
+
end
|
|
102
|
+
is_can_csa = true # Track that this has the CAN/ wrapper
|
|
103
|
+
|
|
104
|
+
# Normalize CSA- to CSA (with space) for parsing
|
|
105
|
+
wrapped_input = wrapped_input.sub(/^CSA-/, "CSA ")
|
|
106
|
+
|
|
107
|
+
# Parse the wrapped identifier recursively
|
|
108
|
+
base = parse(wrapped_input)
|
|
109
|
+
|
|
110
|
+
# NOTE: Series identifiers should be wrapped in CanadianAdopted when
|
|
111
|
+
# they have CAN/CSA- prefix. The Series will handle rendering correctly.
|
|
112
|
+
# Do NOT return Series directly - always wrap in CanadianAdopted.
|
|
113
|
+
|
|
114
|
+
# Set publisher prefix on wrapped identifier
|
|
115
|
+
# For Series identifiers with CAN/ wrapper, use full "CAN/CSA-" prefix
|
|
116
|
+
# For other identifiers, use the detected original_prefix ("CSA-" or "CSA")
|
|
117
|
+
if base.class.attributes.key?(:publisher_prefix)
|
|
118
|
+
if is_can_csa && base.is_a?(Identifiers::Series)
|
|
119
|
+
# Series gets full "CAN/CSA-" prefix for proper rendering
|
|
120
|
+
base.publisher_prefix = "CAN/CSA-"
|
|
121
|
+
elsif original_prefix
|
|
122
|
+
# For Combined identifiers, set on the primary designation
|
|
123
|
+
if base.is_a?(Identifiers::Combined) && base.identifiers&.first
|
|
124
|
+
primary = base.identifiers.first
|
|
125
|
+
if primary.class.attributes.key?(:publisher_prefix)
|
|
126
|
+
primary.publisher_prefix = original_prefix
|
|
127
|
+
end
|
|
128
|
+
else
|
|
129
|
+
# For non-Combined identifiers, set directly
|
|
130
|
+
base.publisher_prefix = original_prefix
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
# Set reaffirmation on base if it has the attribute
|
|
136
|
+
if base.class.attributes.key?(:reaffirmation) && reaffirm_year
|
|
137
|
+
base.reaffirmation = reaffirm_year
|
|
138
|
+
if base.class.attributes.key?(:original_reaffirmation_4digit)
|
|
139
|
+
base.original_reaffirmation_4digit = reaffirmation_was_4digit
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
# Create CanadianAdoptedIdentifier wrapper
|
|
144
|
+
result = Identifiers::CanadianAdopted.new
|
|
145
|
+
result.base = base
|
|
146
|
+
result.reaffirmation = reaffirm_year if reaffirm_year
|
|
147
|
+
|
|
148
|
+
return result
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
# Detect CAN3- wrapper (historical Canadian adoption)
|
|
152
|
+
if input.start_with?("CAN3-")
|
|
153
|
+
# This is a historical Canadian adoption - parse as wrapper
|
|
154
|
+
# Remove CAN3- prefix
|
|
155
|
+
wrapped_input = input.sub(/^CAN3-/, "CSA ")
|
|
156
|
+
|
|
157
|
+
# Detect year format before normalization (CAN3- standards use dash format)
|
|
158
|
+
# Format: CAN3-Z299.0-86 (uses dash, not colon)
|
|
159
|
+
has_dash_year = wrapped_input.match?(/-\d{2}\b/) # Match -86, -05, etc. (2-digit years)
|
|
160
|
+
|
|
161
|
+
# Extract reaffirmation FIRST (before any other processing)
|
|
162
|
+
reaffirm_year = nil
|
|
163
|
+
reaffirmation_was_4digit = false # Track original format
|
|
164
|
+
if wrapped_input =~ /\(R(\d{2,4})\)/
|
|
165
|
+
reaffirm_year = $1
|
|
166
|
+
reaffirmation_was_4digit = ($1.length == 4) # Track if original was 4-digit
|
|
167
|
+
# Convert 2-digit year to 4-digit if needed
|
|
168
|
+
if reaffirm_year.length == 2
|
|
169
|
+
year_int = reaffirm_year.to_i
|
|
170
|
+
reaffirm_year = year_int < 50 ? "20#{reaffirm_year}" : "19#{reaffirm_year}"
|
|
171
|
+
end
|
|
172
|
+
wrapped_input = wrapped_input.sub(/\s*\(R\d{2,4}\)/, "")
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
# Parse the wrapped identifier recursively
|
|
176
|
+
base = parse(wrapped_input)
|
|
177
|
+
|
|
178
|
+
# Set year_format for dash format identifiers (preserve original 2-digit year)
|
|
179
|
+
if has_dash_year && base.class.attributes.key?(:year_format)
|
|
180
|
+
base.year_format = "dash"
|
|
181
|
+
# Mark original year as 2-digit so renderer converts back (1986 → 86)
|
|
182
|
+
if base.class.attributes.key?(:original_year_4digit)
|
|
183
|
+
base.original_year_4digit = false
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
# Check if this is a Series identifier - return it directly with CAN3- prefix
|
|
188
|
+
# Series identifiers are complete identifier types and handle the prefix themselves
|
|
189
|
+
# They don't need to be wrapped in CanadianAdopted
|
|
190
|
+
if base.is_a?(Identifiers::Series)
|
|
191
|
+
base.publisher_prefix = "CAN3-"
|
|
192
|
+
base.reaffirmation = reaffirm_year if reaffirm_year
|
|
193
|
+
base.original_reaffirmation_4digit = reaffirmation_was_4digit
|
|
194
|
+
return base
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
# Set CAN3- as publisher prefix on wrapped identifier
|
|
198
|
+
if base.class.attributes.key?(:publisher_prefix)
|
|
199
|
+
base.publisher_prefix = "CAN3-"
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
# Set reaffirmation on base if it has the attribute
|
|
203
|
+
if base.class.attributes.key?(:reaffirmation) && reaffirm_year
|
|
204
|
+
base.reaffirmation = reaffirm_year
|
|
205
|
+
if base.class.attributes.key?(:original_reaffirmation_4digit)
|
|
206
|
+
base.original_reaffirmation_4digit = reaffirmation_was_4digit
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
# Create CanadianAdoptedIdentifier wrapper
|
|
211
|
+
result = Identifiers::CanadianAdopted.new
|
|
212
|
+
result.base = base
|
|
213
|
+
result.reaffirmation = reaffirm_year if reaffirm_year
|
|
214
|
+
|
|
215
|
+
return result
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
# Detect CSA adoption of international standards
|
|
219
|
+
# Examples: CSA ISO/IEC TR 12785-3:15, CSA CISPR 16-1-1:18, CSA IEC 60601-1:08
|
|
220
|
+
# CSA CEI/IEC 61000-4-28-01 (bilingual)
|
|
221
|
+
if input.match?(/^CSA (ISO\/IEC|CEI\/IEC|CISPR|IEC|CEI|ISO)\s/)
|
|
222
|
+
# This is CSA adoption of international standard
|
|
223
|
+
# Extract the wrapped standard portion
|
|
224
|
+
wrapped_input = input.sub(/^CSA\s+/, "")
|
|
225
|
+
|
|
226
|
+
# Extract reaffirmation FIRST (before parsing)
|
|
227
|
+
reaffirm_year = nil
|
|
228
|
+
if wrapped_input =~ /\(R(\d{2,4})\)/
|
|
229
|
+
reaffirm_year = $1
|
|
230
|
+
# Convert 2-digit year to 4-digit if needed
|
|
231
|
+
if reaffirm_year.length == 2
|
|
232
|
+
year_int = reaffirm_year.to_i
|
|
233
|
+
reaffirm_year = year_int < 50 ? "20#{reaffirm_year}" : "19#{reaffirm_year}"
|
|
234
|
+
end
|
|
235
|
+
wrapped_input = wrapped_input.sub(/\s*\(R\d{2,4}\)/, "")
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
# Convert 2-digit years to 4-digit for external parser
|
|
239
|
+
# :15 → :2015, :04 → :2004
|
|
240
|
+
if wrapped_input =~ /:(\d{2})\b/
|
|
241
|
+
short_year_str = $1 # Keep as string "04", "15", etc.
|
|
242
|
+
short_year_int = short_year_str.to_i
|
|
243
|
+
# Determine century: 00-49 → 2000s, 50-99 → 1900s
|
|
244
|
+
full_year = short_year_int < 50 ? "20#{short_year_str}" : "19#{short_year_str}"
|
|
245
|
+
wrapped_input = wrapped_input.sub(/:#{short_year_str}\b/,
|
|
246
|
+
":#{full_year}")
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
# Convert CSA amendment format to ISO/IEC format
|
|
250
|
+
# /A1:22 → /Amd 1:2022, /A1-22 → /Amd 1-2022
|
|
251
|
+
# Also handle 2-digit and 4-digit amendment years (convert to 4-digit)
|
|
252
|
+
# Note: In gsub blocks with string regex, we must use $1, $2, $3
|
|
253
|
+
# because the block receives a String, not MatchData
|
|
254
|
+
wrapped_input = wrapped_input.gsub(%r{/A(\d+)([:/-])(\d{2,4})\b}) do
|
|
255
|
+
amendment_num = $1
|
|
256
|
+
separator = $2
|
|
257
|
+
amend_year_str = $3
|
|
258
|
+
amend_year_int = amend_year_str.to_i
|
|
259
|
+
# Convert 2-digit year to 4-digit if needed
|
|
260
|
+
if amend_year_str.length == 2
|
|
261
|
+
amend_full_year = amend_year_int < 50 ? "20#{amend_year_str}" : "19#{amend_year_str}"
|
|
262
|
+
else
|
|
263
|
+
amend_full_year = amend_year_str
|
|
264
|
+
end
|
|
265
|
+
"/Amd #{amendment_num}#{separator}#{amend_full_year}"
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
# Parse with appropriate flavor parser. The helper probes several
|
|
269
|
+
# flavors and reports failure with nil; the public contract is a
|
|
270
|
+
# raise, so translate here.
|
|
271
|
+
base = parse_external_standard(wrapped_input)
|
|
272
|
+
unless base
|
|
273
|
+
raise Pubid::Errors::ParseError.new(
|
|
274
|
+
"Unparseable adopted standard: #{input}",
|
|
275
|
+
input: input, flavor: "csa",
|
|
276
|
+
)
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
# Create CsaAdoptedIdentifier wrapper
|
|
280
|
+
result = Identifiers::CsaAdopted.new
|
|
281
|
+
result.base = base
|
|
282
|
+
result.reaffirmation = reaffirm_year if reaffirm_year
|
|
283
|
+
|
|
284
|
+
return result
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
# Detect package identifiers
|
|
288
|
+
# Examples: CSA Z662:23 PACKAGE INCLUDES: +1 (PDF & ESA)
|
|
289
|
+
# CSA B149.1:25 Code, Handbook & Training Package (materials BEFORE keyword)
|
|
290
|
+
# CSA B149.1:20 PACKAGE (PDF + PRINT) (no materials)
|
|
291
|
+
# CSA B108:23 PACKAGE (no trailing space)
|
|
292
|
+
if input.match?(/\sPACKAGE\b/i)
|
|
293
|
+
# Handle two formats:
|
|
294
|
+
# 1. {base} PACKAGE {materials} - materials after keyword
|
|
295
|
+
# 2. {base} {materials} PACKAGE - materials before keyword
|
|
296
|
+
|
|
297
|
+
# Check if materials come after PACKAGE keyword
|
|
298
|
+
# Match: "CSA Z662:23 PACKAGE INCLUDES: +1" or "CSA B149.1:20 PACKAGE (PDF + PRINT)"
|
|
299
|
+
case input
|
|
300
|
+
when /\sPACKAGE\s+[A-Z]/i
|
|
301
|
+
# Format: {base} PACKAGE {materials}
|
|
302
|
+
# Extract materials after PACKAGE keyword
|
|
303
|
+
base_input, package_materials = input.split(/\s+PACKAGE\s+/i, 2)
|
|
304
|
+
base_input = base_input.strip
|
|
305
|
+
package_materials = package_materials ? package_materials.strip : ""
|
|
306
|
+
materials_after = true
|
|
307
|
+
when /:(\d{2,4})(\s+[^P]+)\s+PACKAGE/i
|
|
308
|
+
# Format: {base} PACKAGE or {base} {materials} PACKAGE
|
|
309
|
+
# Examples: "C22.1-15 PACKAGE" (no materials), "CSA B149.1:25 Code, Handbook & Training Package"
|
|
310
|
+
|
|
311
|
+
# Check if there's a year followed by materials before PACKAGE
|
|
312
|
+
# Must check this BEFORE the generic "{base} PACKAGE" pattern
|
|
313
|
+
$1
|
|
314
|
+
$2
|
|
315
|
+
|
|
316
|
+
# Check if this is a combined identifier (has comma with CSA after it)
|
|
317
|
+
# Pattern: ", CSA" or ", CAN" which indicates combined identifier
|
|
318
|
+
if input.match?(/,\s+CSA/)
|
|
319
|
+
# For combined identifiers, we need to extract everything before "& Training Package"
|
|
320
|
+
# The base is the combined identifier, materials is just "& Training Package"
|
|
321
|
+
combined_match = input.match(/^(.+?)(\s+&[^P]+)\s+PACKAGE$/i)
|
|
322
|
+
if combined_match
|
|
323
|
+
base_input = combined_match[1].strip
|
|
324
|
+
package_materials = "#{combined_match[2].strip} Package" # Keep "& Training Package"
|
|
325
|
+
else
|
|
326
|
+
# Fallback to year-based extraction
|
|
327
|
+
year_match = input.match(/:\d{2,4}/)
|
|
328
|
+
if year_match
|
|
329
|
+
base_input = input[0..(year_match.end(0) - 1)]
|
|
330
|
+
materials_input = input[year_match.end(0)..].strip
|
|
331
|
+
package_materials = materials_input
|
|
332
|
+
end
|
|
333
|
+
end
|
|
334
|
+
else
|
|
335
|
+
# Standard single identifier with materials before PACKAGE
|
|
336
|
+
year_match = input.match(/:\d{2,4}/)
|
|
337
|
+
if year_match
|
|
338
|
+
base_input = input[0..(year_match.end(0) - 1)]
|
|
339
|
+
# Materials is everything between base and PACKAGE - keep the "Package" suffix for correct capitalization
|
|
340
|
+
materials_input = input[year_match.end(0)..].strip
|
|
341
|
+
package_materials = materials_input # Keep full materials including "Package" suffix
|
|
342
|
+
base_input = base_input.strip
|
|
343
|
+
end
|
|
344
|
+
end
|
|
345
|
+
materials_after = false
|
|
346
|
+
# Format: {base} {materials} PACKAGE - "CSA B149.1:25 Code, Handbook & Training Package"
|
|
347
|
+
# OR: Combined identifier with package: "CSA B149.1:25, CSA B149.2:25 & Training Package"
|
|
348
|
+
when /^(.+?)\s+PACKAGE\s*$/i
|
|
349
|
+
# Format: {base} PACKAGE (no materials) - "C22.1-15 PACKAGE"
|
|
350
|
+
# Treat PACKAGE as the package description
|
|
351
|
+
base_input = input.sub(/\s+PACKAGE\s*$/i, "").strip
|
|
352
|
+
package_materials = "" # No additional materials
|
|
353
|
+
materials_after = true
|
|
354
|
+
else
|
|
355
|
+
# Fallback: try parsing incrementally
|
|
356
|
+
tokens = input.split(/\s+/)
|
|
357
|
+
base_input = ""
|
|
358
|
+
tokens.each do |token|
|
|
359
|
+
break if token.match?(/^PACKAGE$/i)
|
|
360
|
+
|
|
361
|
+
test_input = base_input.empty? ? token : "#{base_input} #{token}"
|
|
362
|
+
break unless try_parse(test_input)
|
|
363
|
+
|
|
364
|
+
base_input = test_input
|
|
365
|
+
end
|
|
366
|
+
|
|
367
|
+
# Extract materials as everything between base and PACKAGE
|
|
368
|
+
if base_input && base_input.length < input.length
|
|
369
|
+
materials_input = input[base_input.length..].strip
|
|
370
|
+
package_materials = materials_input.sub(/\s+PACKAGE\s*$/i,
|
|
371
|
+
"").strip
|
|
372
|
+
materials_after = !package_materials.empty?
|
|
373
|
+
end
|
|
374
|
+
end
|
|
375
|
+
|
|
376
|
+
# Parse the base identifier recursively. An unparseable base is a
|
|
377
|
+
# failed package, not a nil.
|
|
378
|
+
if base_input.nil? || base_input.empty?
|
|
379
|
+
raise Pubid::Errors::ParseError.new(
|
|
380
|
+
"Unparseable package base: #{input}",
|
|
381
|
+
input: input, flavor: "csa",
|
|
382
|
+
)
|
|
383
|
+
end
|
|
384
|
+
|
|
385
|
+
base = parse(base_input)
|
|
386
|
+
|
|
387
|
+
# Create PackageIdentifier
|
|
388
|
+
result = Identifiers::Package.new
|
|
389
|
+
result.base = base
|
|
390
|
+
# Set materials if present
|
|
391
|
+
if package_materials && !package_materials.empty?
|
|
392
|
+
result.package_materials = package_materials
|
|
393
|
+
end
|
|
394
|
+
result.package_keyword = "PACKAGE"
|
|
395
|
+
# Set materials_after_keyword flag based on which format we detected
|
|
396
|
+
result.materials_after_keyword = materials_after
|
|
397
|
+
|
|
398
|
+
return result
|
|
399
|
+
end
|
|
400
|
+
|
|
401
|
+
# Legacy handling for CAN/CSA- and CAN3- (will be migrated to proper classes later)
|
|
402
|
+
# Detect original publisher prefix before normalization
|
|
403
|
+
publisher_prefix = if input.start_with?("CAN/CSA-")
|
|
404
|
+
"CAN/CSA-"
|
|
405
|
+
elsif input.start_with?("CAN3-")
|
|
406
|
+
"CAN3-"
|
|
407
|
+
elsif input.start_with?("CSA ")
|
|
408
|
+
"CSA"
|
|
409
|
+
end
|
|
410
|
+
|
|
411
|
+
# Detect year format before normalization
|
|
412
|
+
# CAN/CSA- standards use dash format: CAN/CSA-C22.2-05
|
|
413
|
+
# Modern CSA standards use colon format: CSA B149:20
|
|
414
|
+
has_dash_year = input.match?(/-\d{2}\b/)
|
|
415
|
+
|
|
416
|
+
# Normalize CAN/CSA- and CAN3- to CSA (global replacement for combined identifiers)
|
|
417
|
+
normalized = input.gsub("CAN/CSA-", "CSA ")
|
|
418
|
+
# Normalize CAN3- to CSA (historical prefix)
|
|
419
|
+
normalized = normalized.gsub("CAN3-", "CSA ")
|
|
420
|
+
|
|
421
|
+
tree = Parser.new.parse(normalized)
|
|
422
|
+
result = build!(tree, input)
|
|
423
|
+
|
|
424
|
+
# Set publisher prefix if detected
|
|
425
|
+
set_publisher_prefix(result, publisher_prefix) if publisher_prefix
|
|
426
|
+
|
|
427
|
+
# Set year format if detected as dash and not already set
|
|
428
|
+
result.year_format = "dash" if has_dash_year && result.year_format.nil?
|
|
429
|
+
|
|
430
|
+
result
|
|
431
|
+
rescue Parslet::ParseFailed => e
|
|
432
|
+
raise e
|
|
433
|
+
end
|
|
434
|
+
|
|
435
|
+
# Build a parse tree into an identifier, or fail loudly.
|
|
436
|
+
#
|
|
437
|
+
# Builder#build can return nil for a tree it recognises but cannot map
|
|
438
|
+
# to a class. `parse` must return an identifier or raise — every flavor
|
|
439
|
+
# but `api` already honours that — because a nil surfaces in the caller
|
|
440
|
+
# as a NoMethodError far from the input that caused it, rather than as a
|
|
441
|
+
# catchable parse failure.
|
|
442
|
+
def self.build!(tree, input)
|
|
443
|
+
built = Builder.new.build(tree)
|
|
444
|
+
return built if built
|
|
445
|
+
|
|
446
|
+
raise Pubid::Errors::ParseError.new(
|
|
447
|
+
"Unparseable CSA identifier: #{input}",
|
|
448
|
+
input: input, flavor: "csa",
|
|
449
|
+
)
|
|
450
|
+
end
|
|
451
|
+
|
|
452
|
+
# Probe whether a string parses. The package base scan walks
|
|
453
|
+
# progressively longer prefixes and keeps the longest that succeeds, so
|
|
454
|
+
# it is the one caller that genuinely wants a nil rather than a raise.
|
|
455
|
+
def self.try_parse(input)
|
|
456
|
+
parse(input)
|
|
457
|
+
rescue Parslet::ParseFailed, ArgumentError
|
|
458
|
+
nil
|
|
459
|
+
end
|
|
460
|
+
|
|
461
|
+
def self.set_publisher_prefix(obj, prefix)
|
|
462
|
+
# Set on main object if it has the attribute
|
|
463
|
+
if obj.class.attributes.key?(:publisher_prefix)
|
|
464
|
+
obj.publisher_prefix = prefix
|
|
465
|
+
end
|
|
466
|
+
|
|
467
|
+
# Set on combined identifier parts. The primary designation always
|
|
468
|
+
# takes the prefix; a trailing one only when it printed a publisher of
|
|
469
|
+
# its own (a bare continuation must stay bare).
|
|
470
|
+
if obj.is_a?(Identifiers::Combined)
|
|
471
|
+
Array(obj.identifiers).each_with_index do |part, index|
|
|
472
|
+
next unless part.class.attributes.key?(:publisher_prefix)
|
|
473
|
+
next if index.positive? &&
|
|
474
|
+
!(part.class.attributes.key?(:has_publisher) && part.has_publisher)
|
|
475
|
+
|
|
476
|
+
part.publisher_prefix = prefix
|
|
477
|
+
end
|
|
478
|
+
end
|
|
479
|
+
|
|
480
|
+
# Set on bundled identifier base
|
|
481
|
+
if obj.is_a?(Identifiers::Bundled) && obj.base
|
|
482
|
+
set_publisher_prefix(obj.base, prefix)
|
|
483
|
+
end
|
|
484
|
+
end
|
|
485
|
+
|
|
486
|
+
def self.parse_external_standard(input)
|
|
487
|
+
# Try ISO/IEC first (most common)
|
|
488
|
+
if input.match?(/^(ISO\/IEC|ISO|IEC|CEI|CEI\/IEC)\s/)
|
|
489
|
+
begin
|
|
490
|
+
# Normalize CEI/IEC to IEC for parsing (CEI is French for IEC)
|
|
491
|
+
normalized_input = input.sub(/^CEI\/IEC/, "IEC")
|
|
492
|
+
return Pubid::Iso.parse(normalized_input)
|
|
493
|
+
rescue StandardError
|
|
494
|
+
return nil
|
|
495
|
+
end
|
|
496
|
+
end
|
|
497
|
+
|
|
498
|
+
# Try CISPR (uses IEC parser)
|
|
499
|
+
if input.match?(/^CISPR\s/)
|
|
500
|
+
begin
|
|
501
|
+
return Pubid::Iec.parse(input)
|
|
502
|
+
rescue StandardError
|
|
503
|
+
return nil
|
|
504
|
+
end
|
|
505
|
+
end
|
|
506
|
+
|
|
507
|
+
nil
|
|
508
|
+
end
|
|
509
|
+
|
|
510
|
+
# CSA stores the publication year in its own plain `year` string
|
|
511
|
+
# attribute (not a `Components::Date`), so the base `#exclude`'s
|
|
512
|
+
# `:year`->`:date` remap nils the unused inherited `date` and leaves
|
|
513
|
+
# `year` intact. Override to nil `year` (and its formatting metadata)
|
|
514
|
+
# when `:year`/`:date` is excluded, so a partial (year-less) CSA
|
|
515
|
+
# reference is a year wildcard under `matches?(row, ignore: [:year])`.
|
|
516
|
+
# The metadata attrs (`year_format`, `year_prefix`,
|
|
517
|
+
# `original_year_4digit`, `french`) are year-derived — a year-less
|
|
518
|
+
# parse leaves them nil/false, so they must be reset here too or `==`
|
|
519
|
+
# would still differ. `french` in particular is only ever set from a
|
|
520
|
+
# `:F` year prefix (the French-edition form `CSA B149.1:F20`), so a
|
|
521
|
+
# bare `CSA B149.1` reference must wildcard it to match both the
|
|
522
|
+
# English and French editions of a document number. `super` preserves
|
|
523
|
+
# the base recursion into nested identifiers (adoption wrappers
|
|
524
|
+
# delegate their year to an inner id and lack a `year` accessor, hence
|
|
525
|
+
# the `respond_to?` guard). Mirrors BIPM.
|
|
526
|
+
def exclude(*args)
|
|
527
|
+
result = super
|
|
528
|
+
year_keys = args & %i[year date]
|
|
529
|
+
if !year_keys.empty? && result.respond_to?(:year=)
|
|
530
|
+
result.year = nil
|
|
531
|
+
result.year_format = nil
|
|
532
|
+
result.year_prefix = nil
|
|
533
|
+
result.original_year_4digit = false
|
|
534
|
+
result.french = nil
|
|
535
|
+
end
|
|
536
|
+
result
|
|
537
|
+
end
|
|
538
|
+
|
|
539
|
+
# CSA encodes its identity across many shape-specific attributes
|
|
540
|
+
# (`publisher_prefix`, `number`, `no_number`, `series`, `series_prefix`,
|
|
541
|
+
# `package`, `reaffirmation`, `year` with prefix/format/French markers,
|
|
542
|
+
# etc.) that the generic MrString renderer doesn't know about. The
|
|
543
|
+
# CSA `to_s` already round-trips losslessly through the CSA parser, so
|
|
544
|
+
# MR mirrors it: ` ` → `.`, `:` → `.` (so the year never looks like
|
|
545
|
+
# another code segment), `/` → `-` (CAN/CSA- prefix), then lowercased
|
|
546
|
+
# to match the all-lowercase MR convention (issue #142).
|
|
547
|
+
#
|
|
548
|
+
# Those three are the SEMANTIC mappings — they carry CSA's segment
|
|
549
|
+
# structure. Everything else is then neutralised by CHARSET, not by an
|
|
550
|
+
# enumerated escape list, so a character that appears in a future
|
|
551
|
+
# reference cannot leak into what `to_slug` hands a filesystem. CSA
|
|
552
|
+
# references really do carry `(`, `)`, `,`, `&` and `+` today
|
|
553
|
+
# (`CSA C22.2 NO. 100:14 (R2024)`, `… Code, Handbook & Training
|
|
554
|
+
# Package`, `… + A1:15`), and the old `tr` chain let all of them
|
|
555
|
+
# through — 601 of 816 slugs were not filename-safe. The BIPM `mr_slug`
|
|
556
|
+
# precedent.
|
|
557
|
+
def to_mr_string
|
|
558
|
+
to_s
|
|
559
|
+
.downcase
|
|
560
|
+
.tr(" ", ".").tr(":", ".").tr("/", "-")
|
|
561
|
+
.gsub(/[^a-z0-9._-]+/, "-")
|
|
562
|
+
.gsub(/\A[-.]+|[-.]+\z/, "")
|
|
563
|
+
end
|
|
564
|
+
|
|
565
|
+
def to_slug
|
|
566
|
+
to_mr_string
|
|
567
|
+
end
|
|
568
|
+
end
|
|
569
|
+
end
|
|
570
|
+
end
|