pubid 1.15.19 → 2.0.0.pre.alpha.2
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 +2041 -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/ccsds/update_codes.yaml +1 -0
- data/data/iec/update_codes.yaml +67 -0
- data/data/ieee/update_codes.yaml +104 -0
- data/data/iso/update_codes.yaml +21 -0
- data/data/nist/update_codes.yaml +89 -0
- data/data/plateau/update_codes.yaml +6 -0
- data/lib/pubid/amca/builder.rb +176 -0
- data/lib/pubid/amca/identifier.rb +57 -0
- data/lib/pubid/amca/identifiers/base.rb +64 -0
- data/lib/pubid/amca/identifiers/interpretation.rb +51 -0
- data/lib/pubid/amca/identifiers/publication.rb +47 -0
- data/lib/pubid/amca/identifiers/standard.rb +22 -0
- data/lib/pubid/amca/identifiers.rb +12 -0
- data/lib/pubid/amca/parser.rb +153 -0
- data/lib/pubid/amca/scheme.rb +16 -0
- data/lib/pubid/amca/single_identifier.rb +33 -0
- data/lib/pubid/amca/urn_generator.rb +50 -0
- data/lib/pubid/amca.rb +26 -0
- data/lib/pubid/ansi/builder.rb +52 -0
- data/lib/pubid/ansi/identifier.rb +55 -0
- data/lib/pubid/ansi/identifiers/american_national_standard.rb +12 -0
- data/lib/pubid/ansi/identifiers/standard.rb +16 -0
- data/lib/pubid/ansi/identifiers.rb +11 -0
- data/lib/pubid/ansi/parser.rb +91 -0
- data/lib/pubid/ansi/scheme.rb +15 -0
- data/lib/pubid/ansi/single_identifier.rb +45 -0
- data/lib/pubid/ansi/urn_generator.rb +76 -0
- data/lib/pubid/ansi.rb +27 -0
- data/lib/pubid/api/builder.rb +85 -0
- data/lib/pubid/api/components/code.rb +9 -0
- data/lib/pubid/api/identifier.rb +68 -0
- data/lib/pubid/api/identifiers/base.rb +24 -0
- data/lib/pubid/api/identifiers/bulletin.rb +15 -0
- data/lib/pubid/api/identifiers/continuous_operations_standard.rb +15 -0
- data/lib/pubid/api/identifiers/mpms.rb +44 -0
- data/lib/pubid/api/identifiers/publication.rb +15 -0
- data/lib/pubid/api/identifiers/recommended_practice.rb +15 -0
- data/lib/pubid/api/identifiers/specification.rb +15 -0
- data/lib/pubid/api/identifiers/standard.rb +15 -0
- data/lib/pubid/api/identifiers/technical_report.rb +15 -0
- data/lib/pubid/api/identifiers/typeless_standard.rb +27 -0
- data/lib/pubid/api/parser.rb +140 -0
- data/lib/pubid/api/scheme.rb +66 -0
- data/lib/pubid/api/single_identifier.rb +46 -0
- data/lib/pubid/api/urn_generator.rb +41 -0
- data/lib/pubid/api.rb +17 -0
- data/lib/pubid/ashrae/builder.rb +498 -0
- data/lib/pubid/ashrae/identifier.rb +57 -0
- data/lib/pubid/ashrae/identifiers/addenda_package.rb +46 -0
- data/lib/pubid/ashrae/identifiers/addendum.rb +55 -0
- data/lib/pubid/ashrae/identifiers/base.rb +23 -0
- data/lib/pubid/ashrae/identifiers/combined_addenda.rb +51 -0
- data/lib/pubid/ashrae/identifiers/errata.rb +40 -0
- data/lib/pubid/ashrae/identifiers/guideline.rb +38 -0
- data/lib/pubid/ashrae/identifiers/interpretation.rb +39 -0
- data/lib/pubid/ashrae/identifiers/standard.rb +38 -0
- data/lib/pubid/ashrae/identifiers.rb +16 -0
- data/lib/pubid/ashrae/parser.rb +724 -0
- data/lib/pubid/ashrae/scheme.rb +53 -0
- data/lib/pubid/ashrae/single_identifier.rb +23 -0
- data/lib/pubid/ashrae/supplement_identifier.rb +23 -0
- data/lib/pubid/ashrae/urn_generator.rb +59 -0
- data/lib/pubid/ashrae.rb +21 -0
- data/lib/pubid/asme/builder.rb +153 -0
- data/lib/pubid/asme/components/code.rb +18 -0
- data/lib/pubid/asme/identifier.rb +61 -0
- data/lib/pubid/asme/identifiers/base.rb +70 -0
- data/lib/pubid/asme/identifiers/standard.rb +12 -0
- data/lib/pubid/asme/identifiers.rb +10 -0
- data/lib/pubid/asme/parser.rb +308 -0
- data/lib/pubid/asme/scheme.rb +37 -0
- data/lib/pubid/asme/single_identifier.rb +29 -0
- data/lib/pubid/asme/urn_generator.rb +133 -0
- data/lib/pubid/asme.rb +21 -0
- data/lib/pubid/astm/builder.rb +159 -0
- data/lib/pubid/astm/components/code.rb +33 -0
- data/lib/pubid/astm/identifier.rb +92 -0
- data/lib/pubid/astm/identifiers/adjunct.rb +21 -0
- data/lib/pubid/astm/identifiers/base.rb +13 -0
- data/lib/pubid/astm/identifiers/data_series.rb +25 -0
- data/lib/pubid/astm/identifiers/iso_dual_published.rb +74 -0
- data/lib/pubid/astm/identifiers/manual.rb +40 -0
- data/lib/pubid/astm/identifiers/monograph.rb +25 -0
- data/lib/pubid/astm/identifiers/research_report.rb +18 -0
- data/lib/pubid/astm/identifiers/standard.rb +52 -0
- data/lib/pubid/astm/identifiers/technical_report.rb +23 -0
- data/lib/pubid/astm/identifiers/work_in_progress.rb +21 -0
- data/lib/pubid/astm/parser.rb +244 -0
- data/lib/pubid/astm/scheme.rb +55 -0
- data/lib/pubid/astm/single_identifier.rb +25 -0
- data/lib/pubid/astm/urn_generator.rb +99 -0
- data/lib/pubid/astm.rb +38 -0
- data/lib/pubid/bsi/builder.rb +1483 -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 +87 -0
- data/lib/pubid/bsi/identifiers/addendum_document.rb +64 -0
- data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +95 -0
- data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +82 -0
- data/lib/pubid/bsi/identifiers/aerospace_standard.rb +118 -0
- data/lib/pubid/bsi/identifiers/amendment.rb +40 -0
- data/lib/pubid/bsi/identifiers/base.rb +11 -0
- data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +27 -0
- data/lib/pubid/bsi/identifiers/british_standard.rb +33 -0
- data/lib/pubid/bsi/identifiers/bundled_identifier.rb +114 -0
- data/lib/pubid/bsi/identifiers/committee_document.rb +51 -0
- data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +152 -0
- data/lib/pubid/bsi/identifiers/corrigendum.rb +28 -0
- data/lib/pubid/bsi/identifiers/detailed_specification.rb +69 -0
- data/lib/pubid/bsi/identifiers/disc.rb +56 -0
- data/lib/pubid/bsi/identifiers/draft_document.rb +71 -0
- data/lib/pubid/bsi/identifiers/electronic_book.rb +52 -0
- data/lib/pubid/bsi/identifiers/expert_commentary.rb +47 -0
- data/lib/pubid/bsi/identifiers/explanatory_supplement.rb +82 -0
- data/lib/pubid/bsi/identifiers/flex.rb +61 -0
- data/lib/pubid/bsi/identifiers/handbook.rb +39 -0
- data/lib/pubid/bsi/identifiers/index.rb +62 -0
- data/lib/pubid/bsi/identifiers/method.rb +76 -0
- data/lib/pubid/bsi/identifiers/national_annex.rb +73 -0
- data/lib/pubid/bsi/identifiers/practice_guide.rb +27 -0
- data/lib/pubid/bsi/identifiers/publicly_available_specification.rb +79 -0
- data/lib/pubid/bsi/identifiers/published_document.rb +79 -0
- data/lib/pubid/bsi/identifiers/section.rb +62 -0
- data/lib/pubid/bsi/identifiers/set.rb +46 -0
- data/lib/pubid/bsi/identifiers/standalone_amendment.rb +40 -0
- data/lib/pubid/bsi/identifiers/supplement_document.rb +51 -0
- data/lib/pubid/bsi/identifiers/supplementary_index.rb +81 -0
- data/lib/pubid/bsi/identifiers/technical_specification.rb +79 -0
- data/lib/pubid/bsi/identifiers/test_method.rb +67 -0
- data/lib/pubid/bsi/identifiers/value_added_publication.rb +52 -0
- data/lib/pubid/bsi/identifiers.rb +52 -0
- data/lib/pubid/bsi/model.rb +196 -0
- data/lib/pubid/bsi/parser.rb +659 -0
- data/lib/pubid/bsi/scheme.rb +243 -0
- data/lib/pubid/bsi/single_identifier.rb +129 -0
- data/lib/pubid/bsi/urn_generator.rb +84 -0
- data/lib/pubid/bsi.rb +32 -0
- data/lib/pubid/builder/base.rb +138 -0
- data/lib/pubid/bundled_identifier.rb +126 -0
- data/lib/pubid/ccsds/builder.rb +56 -0
- data/lib/pubid/ccsds/identifier.rb +84 -0
- data/lib/pubid/ccsds/identifiers/base.rb +89 -0
- data/lib/pubid/ccsds/identifiers/base_BASE_88929.rb +70 -0
- data/lib/pubid/ccsds/identifiers/corrigendum.rb +39 -0
- data/lib/pubid/ccsds/identifiers.rb +10 -0
- data/lib/pubid/ccsds/parser.rb +71 -0
- data/lib/pubid/ccsds/scheme.rb +57 -0
- data/lib/pubid/ccsds/single_identifier.rb +77 -0
- data/lib/pubid/ccsds/supplement_identifier.rb +33 -0
- data/lib/pubid/ccsds/urn_generator.rb +115 -0
- data/lib/pubid/ccsds.rb +21 -0
- data/lib/pubid/cen_cenelec/builder.rb +330 -0
- data/lib/pubid/cen_cenelec/identifier.rb +52 -0
- data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +40 -0
- data/lib/pubid/cen_cenelec/identifiers/amendment.rb +29 -0
- data/lib/pubid/cen_cenelec/identifiers/base.rb +75 -0
- data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +28 -0
- data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +27 -0
- data/lib/pubid/cen_cenelec/identifiers/cenelec_harmonization_document.rb +28 -0
- data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +61 -0
- data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +35 -0
- data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +41 -0
- data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +37 -0
- data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +28 -0
- data/lib/pubid/cen_cenelec/identifiers/fragment.rb +22 -0
- data/lib/pubid/cen_cenelec/identifiers/guide.rb +27 -0
- data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +27 -0
- data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +27 -0
- data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +35 -0
- data/lib/pubid/cen_cenelec/identifiers.rb +32 -0
- data/lib/pubid/cen_cenelec/parser.rb +144 -0
- data/lib/pubid/cen_cenelec/scheme.rb +164 -0
- data/lib/pubid/cen_cenelec/single_identifier.rb +130 -0
- data/lib/pubid/cen_cenelec/supplement_identifier.rb +48 -0
- data/lib/pubid/cen_cenelec/urn_generator.rb +129 -0
- data/lib/pubid/cen_cenelec.rb +21 -0
- data/lib/pubid/cie/builder.rb +399 -0
- data/lib/pubid/cie/components/code.rb +72 -0
- data/lib/pubid/cie/components/language.rb +58 -0
- data/lib/pubid/cie/identifier.rb +71 -0
- data/lib/pubid/cie/identifiers/bundle.rb +20 -0
- data/lib/pubid/cie/identifiers/conference.rb +32 -0
- data/lib/pubid/cie/identifiers/corrigendum.rb +40 -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/standard.rb +58 -0
- data/lib/pubid/cie/identifiers/supplement.rb +45 -0
- data/lib/pubid/cie/identifiers/tutorial_bundle.rb +20 -0
- data/lib/pubid/cie/identifiers.rb +17 -0
- data/lib/pubid/cie/parser.rb +347 -0
- data/lib/pubid/cie/scheme.rb +64 -0
- data/lib/pubid/cie/single_identifier.rb +30 -0
- data/lib/pubid/cie/supplement_identifier.rb +26 -0
- data/lib/pubid/cie/urn_generator.rb +123 -0
- data/lib/pubid/cie.rb +28 -0
- data/lib/pubid/components/code.rb +33 -0
- data/lib/pubid/components/date.rb +49 -0
- data/lib/pubid/components/edition.rb +32 -0
- data/lib/pubid/components/factory.rb +50 -0
- data/lib/pubid/components/language.rb +37 -0
- data/lib/pubid/components/locality.rb +10 -0
- data/lib/pubid/components/publisher.rb +36 -0
- data/lib/pubid/components/stage.rb +54 -0
- data/lib/pubid/components/type.rb +58 -0
- data/lib/pubid/components/typed_stage.rb +59 -0
- data/lib/pubid/components.rb +16 -0
- data/lib/pubid/core/pattern_doc_generator.rb +272 -0
- data/lib/pubid/core/update_codes.rb +77 -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 +27 -0
- data/lib/pubid/csa/identifier.rb +513 -0
- data/lib/pubid/csa/identifiers/base.rb +133 -0
- data/lib/pubid/csa/identifiers/bundled.rb +125 -0
- data/lib/pubid/csa/identifiers/canadian_adopted.rb +82 -0
- data/lib/pubid/csa/identifiers/cec.rb +129 -0
- data/lib/pubid/csa/identifiers/combined.rb +130 -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 +127 -0
- data/lib/pubid/csa/identifiers/standard.rb +10 -0
- data/lib/pubid/csa/identifiers.rb +17 -0
- data/lib/pubid/csa/parser.rb +445 -0
- data/lib/pubid/csa/scheme.rb +44 -0
- data/lib/pubid/csa/single_identifier.rb +30 -0
- data/lib/pubid/csa/urn_generator.rb +80 -0
- data/lib/pubid/csa/wrapper_identifier.rb +31 -0
- data/lib/pubid/csa.rb +25 -0
- data/lib/pubid/etsi/builder.rb +133 -0
- data/lib/pubid/etsi/components/code.rb +42 -0
- data/lib/pubid/etsi/components/version.rb +37 -0
- data/lib/pubid/etsi/components.rb +10 -0
- data/lib/pubid/etsi/identifier.rb +57 -0
- data/lib/pubid/etsi/identifiers/amendment.rb +15 -0
- data/lib/pubid/etsi/identifiers/base.rb +38 -0
- data/lib/pubid/etsi/identifiers/corrigendum.rb +15 -0
- data/lib/pubid/etsi/identifiers/etsi_standard.rb +19 -0
- data/lib/pubid/etsi/identifiers/supplement_identifier.rb +91 -0
- data/lib/pubid/etsi/identifiers.rb +14 -0
- data/lib/pubid/etsi/parser.rb +133 -0
- data/lib/pubid/etsi/scheme.rb +42 -0
- data/lib/pubid/etsi/urn_generator.rb +76 -0
- data/lib/pubid/etsi.rb +21 -0
- data/lib/pubid/export/auditor.rb +89 -0
- data/lib/pubid/export/data_class_exporter.rb +59 -0
- data/lib/pubid/export/exporter.rb +74 -0
- data/lib/pubid/export/flavor_exporter.rb +402 -0
- data/lib/pubid/export/ieee_exporter.rb +78 -0
- data/lib/pubid/export/itu_exporter.rb +66 -0
- data/lib/pubid/export/nist_exporter.rb +64 -0
- data/lib/pubid/export/registry_exporter.rb +90 -0
- data/lib/pubid/export/result.rb +97 -0
- data/lib/pubid/export/scheme_exporter.rb +70 -0
- data/lib/pubid/export.rb +18 -0
- data/lib/pubid/format_detector.rb +16 -0
- data/lib/pubid/format_registry.rb +42 -0
- data/lib/pubid/identifier.rb +242 -0
- data/lib/pubid/identifier_metadata.rb +148 -0
- data/lib/pubid/identifier_registry.rb +198 -0
- data/lib/pubid/idf/builder.rb +82 -0
- data/lib/pubid/idf/identifier.rb +129 -0
- data/lib/pubid/idf/identifiers/amendment.rb +27 -0
- data/lib/pubid/idf/identifiers/corrigendum.rb +27 -0
- data/lib/pubid/idf/identifiers/international_standard.rb +123 -0
- data/lib/pubid/idf/identifiers/reviewed_method.rb +100 -0
- data/lib/pubid/idf/identifiers.rb +13 -0
- data/lib/pubid/idf/parser.rb +143 -0
- data/lib/pubid/idf/scheme.rb +61 -0
- data/lib/pubid/idf/single_identifier.rb +19 -0
- data/lib/pubid/idf/supplement_identifier.rb +43 -0
- data/lib/pubid/idf/urn_generator.rb +84 -0
- data/lib/pubid/idf.rb +25 -0
- data/lib/pubid/iec/builder.rb +458 -0
- data/lib/pubid/iec/components/code.rb +60 -0
- data/lib/pubid/iec/components/consolidated_amendment.rb +59 -0
- data/lib/pubid/iec/components/publisher.rb +36 -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/identifier.rb +256 -0
- data/lib/pubid/iec/identifiers/amendment.rb +94 -0
- data/lib/pubid/iec/identifiers/base.rb +82 -0
- data/lib/pubid/iec/identifiers/component_specification.rb +39 -0
- data/lib/pubid/iec/identifiers/conformity_assessment.rb +39 -0
- data/lib/pubid/iec/identifiers/consolidated_identifier.rb +82 -0
- data/lib/pubid/iec/identifiers/corrigendum.rb +94 -0
- data/lib/pubid/iec/identifiers/fragment_identifier.rb +137 -0
- data/lib/pubid/iec/identifiers/guide.rb +104 -0
- data/lib/pubid/iec/identifiers/international_standard.rb +147 -0
- data/lib/pubid/iec/identifiers/interpretation_sheet.rb +104 -0
- data/lib/pubid/iec/identifiers/operational_document.rb +39 -0
- data/lib/pubid/iec/identifiers/publicly_available_specification.rb +101 -0
- data/lib/pubid/iec/identifiers/sheet_identifier.rb +62 -0
- data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +40 -0
- data/lib/pubid/iec/identifiers/systems_reference_document.rb +40 -0
- data/lib/pubid/iec/identifiers/technical_report.rb +132 -0
- data/lib/pubid/iec/identifiers/technical_specification.rb +132 -0
- data/lib/pubid/iec/identifiers/technology_report.rb +39 -0
- data/lib/pubid/iec/identifiers/test_report_form.rb +78 -0
- data/lib/pubid/iec/identifiers/vap_identifier.rb +73 -0
- data/lib/pubid/iec/identifiers/white_paper.rb +39 -0
- data/lib/pubid/iec/identifiers/working_document.rb +96 -0
- data/lib/pubid/iec/parser.rb +417 -0
- data/lib/pubid/iec/rendering_style.rb +113 -0
- data/lib/pubid/iec/scheme.rb +71 -0
- data/lib/pubid/iec/single_identifier.rb +80 -0
- data/lib/pubid/iec/supplement_identifier.rb +161 -0
- data/lib/pubid/iec/urn_generator.rb +79 -0
- data/lib/pubid/iec/urn_parser.rb +90 -0
- data/lib/pubid/iec.rb +85 -0
- data/lib/pubid/ieee/aiee/builder.rb +71 -0
- data/lib/pubid/ieee/aiee/identifier.rb +105 -0
- data/lib/pubid/ieee/aiee/parser.rb +130 -0
- data/lib/pubid/ieee/aiee.rb +11 -0
- data/lib/pubid/ieee/builder.rb +1237 -0
- data/lib/pubid/ieee/components/code.rb +102 -0
- data/lib/pubid/ieee/components/draft.rb +93 -0
- data/lib/pubid/ieee/components/relationship.rb +157 -0
- data/lib/pubid/ieee/components/typed_stage.rb +100 -0
- data/lib/pubid/ieee/identifier.rb +54 -0
- data/lib/pubid/ieee/identifiers/adopted_standard.rb +33 -0
- data/lib/pubid/ieee/identifiers/base.rb +591 -0
- data/lib/pubid/ieee/identifiers/conformance_identifier.rb +35 -0
- data/lib/pubid/ieee/identifiers/corrigendum.rb +37 -0
- data/lib/pubid/ieee/identifiers/csa_dual_published.rb +51 -0
- data/lib/pubid/ieee/identifiers/dual_identifier.rb +18 -0
- data/lib/pubid/ieee/identifiers/dual_published.rb +28 -0
- data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +27 -0
- data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +34 -0
- data/lib/pubid/ieee/identifiers/joint_development.rb +172 -0
- data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +51 -0
- data/lib/pubid/ieee/identifiers/nesc/base.rb +56 -0
- data/lib/pubid/ieee/identifiers/nesc/draft.rb +28 -0
- data/lib/pubid/ieee/identifiers/nesc/handbook.rb +32 -0
- data/lib/pubid/ieee/identifiers/nesc/redline.rb +26 -0
- data/lib/pubid/ieee/identifiers/nesc/standard.rb +26 -0
- data/lib/pubid/ieee/identifiers/nesc.rb +15 -0
- data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +20 -0
- data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +26 -0
- data/lib/pubid/ieee/identifiers/redlined_standard.rb +33 -0
- data/lib/pubid/ieee/identifiers/si_standard.rb +73 -0
- data/lib/pubid/ieee/identifiers/standard.rb +41 -0
- data/lib/pubid/ieee/identifiers/supplement_identifier.rb +23 -0
- data/lib/pubid/ieee/identifiers.rb +33 -0
- data/lib/pubid/ieee/ire/builder.rb +61 -0
- data/lib/pubid/ieee/ire/identifier.rb +58 -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 +101 -0
- data/lib/pubid/ieee/nesc/parser.rb +154 -0
- data/lib/pubid/ieee/nesc.rb +10 -0
- data/lib/pubid/ieee/parser.rb +1226 -0
- data/lib/pubid/ieee/scheme.rb +90 -0
- data/lib/pubid/ieee/typed_stages.rb +172 -0
- data/lib/pubid/ieee/urn_generator.rb +188 -0
- data/lib/pubid/ieee.rb +32 -0
- data/lib/pubid/ieee_debug.rb +31 -0
- data/lib/pubid/iho/builder.rb +37 -0
- data/lib/pubid/iho/identifier.rb +61 -0
- data/lib/pubid/iho/identifiers/base.rb +41 -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 +14 -0
- data/lib/pubid/iho/parser.rb +68 -0
- data/lib/pubid/iho/scheme.rb +29 -0
- data/lib/pubid/iho/urn_generator.rb +29 -0
- data/lib/pubid/iho.rb +21 -0
- data/lib/pubid/iso/builder.rb +309 -0
- data/lib/pubid/iso/bundled_identifier.rb +85 -0
- data/lib/pubid/iso/combined_identifier.rb +22 -0
- data/lib/pubid/iso/components/code.rb +36 -0
- data/lib/pubid/iso/components/publisher.rb +60 -0
- data/lib/pubid/iso/components.rb +12 -0
- data/lib/pubid/iso/format_resolver.rb +45 -0
- data/lib/pubid/iso/identifier.rb +330 -0
- data/lib/pubid/iso/identifiers/addendum.rb +104 -0
- data/lib/pubid/iso/identifiers/amendment.rb +128 -0
- data/lib/pubid/iso/identifiers/base.rb +115 -0
- data/lib/pubid/iso/identifiers/corrigendum.rb +108 -0
- data/lib/pubid/iso/identifiers/data.rb +76 -0
- data/lib/pubid/iso/identifiers/directives.rb +59 -0
- data/lib/pubid/iso/identifiers/directives_supplement.rb +119 -0
- data/lib/pubid/iso/identifiers/extract.rb +30 -0
- data/lib/pubid/iso/identifiers/guide.rb +100 -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 +89 -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 +87 -0
- data/lib/pubid/iso/identifiers/tc_document.rb +108 -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 +33 -0
- data/lib/pubid/iso/parser.rb +512 -0
- data/lib/pubid/iso/rendering_style.rb +120 -0
- data/lib/pubid/iso/scheme.rb +193 -0
- data/lib/pubid/iso/single_identifier.rb +64 -0
- data/lib/pubid/iso/supplement_identifier.rb +27 -0
- data/lib/pubid/iso/urn_generator.rb +426 -0
- data/lib/pubid/iso/urn_parser.rb +437 -0
- data/lib/pubid/iso/utilities.rb +86 -0
- data/lib/pubid/iso.rb +50 -0
- data/lib/pubid/itu/builder.rb +171 -0
- data/lib/pubid/itu/components/code.rb +39 -0
- data/lib/pubid/itu/components/sector.rb +35 -0
- data/lib/pubid/itu/components/series.rb +29 -0
- data/lib/pubid/itu/i18n.rb +9 -0
- data/lib/pubid/itu/i18n.yaml +30 -0
- data/lib/pubid/itu/identifier.rb +118 -0
- data/lib/pubid/itu/identifiers/amendment.rb +43 -0
- data/lib/pubid/itu/identifiers/annex.rb +74 -0
- data/lib/pubid/itu/identifiers/base.rb +154 -0
- data/lib/pubid/itu/identifiers/combined_identifier.rb +47 -0
- data/lib/pubid/itu/identifiers/corrigendum.rb +44 -0
- data/lib/pubid/itu/identifiers/recommendation.rb +16 -0
- data/lib/pubid/itu/identifiers/special_publication.rb +31 -0
- data/lib/pubid/itu/identifiers/supplement.rb +46 -0
- data/lib/pubid/itu/identifiers.rb +16 -0
- data/lib/pubid/itu/model.rb +111 -0
- data/lib/pubid/itu/parser.rb +225 -0
- data/lib/pubid/itu/scheme.rb +174 -0
- data/lib/pubid/itu/urn_generator.rb +105 -0
- data/lib/pubid/itu.rb +22 -0
- data/lib/pubid/jcgm/builder.rb +88 -0
- data/lib/pubid/jcgm/components/publisher.rb +20 -0
- data/lib/pubid/jcgm/components.rb +9 -0
- data/lib/pubid/jcgm/identifier.rb +54 -0
- data/lib/pubid/jcgm/identifiers/amendment.rb +35 -0
- data/lib/pubid/jcgm/identifiers/guide.rb +21 -0
- data/lib/pubid/jcgm/identifiers/gum_guide.rb +51 -0
- data/lib/pubid/jcgm/identifiers.rb +11 -0
- data/lib/pubid/jcgm/parser.rb +84 -0
- data/lib/pubid/jcgm/scheme.rb +60 -0
- data/lib/pubid/jcgm/single_identifier.rb +48 -0
- data/lib/pubid/jcgm/supplement_identifier.rb +16 -0
- data/lib/pubid/jcgm/urn_generator.rb +110 -0
- data/lib/pubid/jcgm.rb +31 -0
- data/lib/pubid/jis/builder.rb +124 -0
- data/lib/pubid/jis/components/code.rb +59 -0
- data/lib/pubid/jis/components.rb +9 -0
- data/lib/pubid/jis/identifier.rb +61 -0
- data/lib/pubid/jis/identifiers/amendment.rb +16 -0
- data/lib/pubid/jis/identifiers/base.rb +72 -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 +27 -0
- data/lib/pubid/jis/identifiers/technical_report.rb +31 -0
- data/lib/pubid/jis/identifiers/technical_specification.rb +31 -0
- data/lib/pubid/jis/identifiers.rb +17 -0
- data/lib/pubid/jis/parser.rb +109 -0
- data/lib/pubid/jis/scheme.rb +49 -0
- data/lib/pubid/jis/single_identifier.rb +37 -0
- data/lib/pubid/jis/supplement_identifier.rb +47 -0
- data/lib/pubid/jis/urn_generator.rb +25 -0
- data/lib/pubid/jis.rb +23 -0
- data/lib/pubid/lutaml/no_store_registration.rb +30 -0
- data/lib/pubid/nist/builder.rb +2269 -0
- data/lib/pubid/nist/components/code.rb +38 -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/publisher.rb +24 -0
- data/lib/pubid/nist/components/stage.rb +53 -0
- data/lib/pubid/nist/components/supplement.rb +188 -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 +19 -0
- data/lib/pubid/nist/configuration.rb +77 -0
- data/lib/pubid/nist/identifier.rb +62 -0
- data/lib/pubid/nist/identifiers/base.rb +578 -0
- data/lib/pubid/nist/identifiers/circular.rb +68 -0
- data/lib/pubid/nist/identifiers/circular_supplement.rb +50 -0
- data/lib/pubid/nist/identifiers/commercial_standard.rb +41 -0
- data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +56 -0
- data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +56 -0
- data/lib/pubid/nist/identifiers/crpl_report.rb +132 -0
- data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +104 -0
- data/lib/pubid/nist/identifiers/grant_contractor_report.rb +35 -0
- data/lib/pubid/nist/identifiers/handbook.rb +50 -0
- data/lib/pubid/nist/identifiers/internal_report.rb +56 -0
- data/lib/pubid/nist/identifiers/letter_circular.rb +45 -0
- data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +65 -0
- data/lib/pubid/nist/identifiers/monograph.rb +69 -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 +67 -0
- data/lib/pubid/nist/identifiers/special_publication.rb +36 -0
- data/lib/pubid/nist/identifiers/technical_note.rb +90 -0
- data/lib/pubid/nist/identifiers.rb +33 -0
- data/lib/pubid/nist/parser.rb +1117 -0
- data/lib/pubid/nist/scheme.rb +199 -0
- data/lib/pubid/nist/supplement_identifier.rb +67 -0
- data/lib/pubid/nist/urn_generator.rb +133 -0
- data/lib/pubid/nist.rb +37 -0
- data/lib/pubid/oiml/builder.rb +189 -0
- data/lib/pubid/oiml/components/code.rb +20 -0
- data/lib/pubid/oiml/components.rb +9 -0
- data/lib/pubid/oiml/identifier.rb +61 -0
- data/lib/pubid/oiml/identifiers/amendment.rb +13 -0
- data/lib/pubid/oiml/identifiers/annex.rb +62 -0
- data/lib/pubid/oiml/identifiers/base.rb +36 -0
- data/lib/pubid/oiml/identifiers/basic_publication.rb +13 -0
- data/lib/pubid/oiml/identifiers/document.rb +13 -0
- data/lib/pubid/oiml/identifiers/expert_report.rb +13 -0
- data/lib/pubid/oiml/identifiers/guide.rb +13 -0
- data/lib/pubid/oiml/identifiers/recommendation.rb +13 -0
- data/lib/pubid/oiml/identifiers/seminar_report.rb +13 -0
- data/lib/pubid/oiml/identifiers/vocabulary.rb +13 -0
- data/lib/pubid/oiml/identifiers.rb +18 -0
- data/lib/pubid/oiml/parser.rb +173 -0
- data/lib/pubid/oiml/scheme.rb +46 -0
- data/lib/pubid/oiml/single_identifier.rb +90 -0
- data/lib/pubid/oiml/supplement_identifier.rb +43 -0
- data/lib/pubid/oiml/urn_generator.rb +64 -0
- data/lib/pubid/oiml.rb +26 -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.rb +8 -0
- data/lib/pubid/parsers/base.rb +11 -0
- data/lib/pubid/parsers/mr_string.rb +93 -0
- data/lib/pubid/plateau/builder.rb +50 -0
- data/lib/pubid/plateau/identifier.rb +57 -0
- data/lib/pubid/plateau/identifiers/annex.rb +16 -0
- data/lib/pubid/plateau/identifiers/base.rb +51 -0
- data/lib/pubid/plateau/identifiers/handbook.rb +34 -0
- data/lib/pubid/plateau/identifiers/technical_report.rb +20 -0
- data/lib/pubid/plateau/identifiers.rb +12 -0
- data/lib/pubid/plateau/parser.rb +63 -0
- data/lib/pubid/plateau/scheme.rb +45 -0
- data/lib/pubid/plateau/supplement_identifier.rb +72 -0
- data/lib/pubid/plateau/urn_generator.rb +29 -0
- data/lib/pubid/plateau.rb +26 -0
- data/lib/pubid/renderers/base.rb +53 -0
- data/lib/pubid/renderers/directives_renderer.rb +61 -0
- data/lib/pubid/renderers/guide_renderer.rb +24 -0
- data/lib/pubid/renderers/human_readable.rb +70 -0
- data/lib/pubid/renderers/iwa_renderer.rb +20 -0
- data/lib/pubid/renderers/mr_string.rb +16 -0
- data/lib/pubid/renderers/supplement_renderer.rb +36 -0
- data/lib/pubid/renderers/urn.rb +11 -0
- data/lib/pubid/renderers.rb +14 -0
- data/lib/pubid/rendering/base.rb +73 -0
- data/lib/pubid/rendering/common.rb +211 -0
- data/lib/pubid/rendering/context.rb +159 -0
- data/lib/pubid/rendering/date.rb +27 -0
- data/lib/pubid/rendering/format.rb +25 -0
- data/lib/pubid/rendering/language.rb +21 -0
- data/lib/pubid/rendering/numbering.rb +24 -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 +16 -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 +19 -0
- data/lib/pubid/sae/components/type.rb +19 -0
- data/lib/pubid/sae/components.rb +11 -0
- data/lib/pubid/sae/identifier.rb +37 -0
- data/lib/pubid/sae/identifiers/base.rb +42 -0
- data/lib/pubid/sae/identifiers.rb +9 -0
- data/lib/pubid/sae/parser.rb +55 -0
- data/lib/pubid/sae/scheme.rb +47 -0
- data/lib/pubid/sae/urn_generator.rb +38 -0
- data/lib/pubid/sae.rb +19 -0
- data/lib/pubid/scheme.rb +219 -0
- data/lib/pubid/urn_generator/base.rb +110 -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.rb +137 -13
- data/lib/tasks/docs.rake +37 -0
- data/lib/tasks/export.rake +38 -0
- data/lib/tasks/website-data.json +7488 -0
- metadata +616 -171
- data/lib/pubid/registry.rb +0 -30
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "lutaml/model"
|
|
4
|
+
|
|
5
|
+
module Pubid
|
|
6
|
+
module Csa
|
|
7
|
+
module Identifiers
|
|
8
|
+
class Bundled < Lutaml::Model::Serializable
|
|
9
|
+
attribute :base, Standard
|
|
10
|
+
attribute :bundled_with, Standard, collection: true
|
|
11
|
+
attribute :reaffirmation, :string
|
|
12
|
+
attribute :original_reaffirmation_4digit, :boolean, default: -> {
|
|
13
|
+
false
|
|
14
|
+
}
|
|
15
|
+
attribute :year_format, :string # Add for compatibility with identifier.rb
|
|
16
|
+
|
|
17
|
+
def to_s
|
|
18
|
+
# For Cec identifiers, use normalized form (code instead of cec_part + NO.)
|
|
19
|
+
# This is used for "normalized form" rendering in bundled identifiers
|
|
20
|
+
if base.is_a?(Cec)
|
|
21
|
+
# Render base with normalized code format
|
|
22
|
+
prefix = base.publisher_prefix || "CSA"
|
|
23
|
+
needs_space = !prefix.end_with?("-")
|
|
24
|
+
# Convert 4-digit year back to 2-digit for display
|
|
25
|
+
year_display = if base.year
|
|
26
|
+
year_str = base.year.to_s
|
|
27
|
+
if year_str.length == 4 && year_str.start_with?("20")
|
|
28
|
+
year_str[2..3]
|
|
29
|
+
else
|
|
30
|
+
year_str
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
base_str = (needs_space ? "#{prefix} " : prefix) +
|
|
34
|
+
base.code.value.to_s + # Use normalized code (e.g., "C22.2-1")
|
|
35
|
+
":#{year_display}"
|
|
36
|
+
parts = [base_str]
|
|
37
|
+
else
|
|
38
|
+
# Standard rendering for other identifier types
|
|
39
|
+
parts = [base.to_s]
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Add bundled amendments/supplements (without CSA prefix)
|
|
43
|
+
if bundled_with && !bundled_with.empty?
|
|
44
|
+
bundled_with.each do |bundled|
|
|
45
|
+
# For Cec identifiers, use normalized code format
|
|
46
|
+
if bundled.is_a?(Cec)
|
|
47
|
+
bundled_part = bundled.code.value.to_s # Normalized code (e.g., "C22.2-2")
|
|
48
|
+
if bundled.year
|
|
49
|
+
# Use dash if year_format is dash, otherwise colon
|
|
50
|
+
separator = bundled.year_format == "dash" ? "-" : ":"
|
|
51
|
+
bundled_part += separator
|
|
52
|
+
bundled_part += bundled.year_prefix if bundled.year_prefix # Add M or F prefix
|
|
53
|
+
bundled_part += "F" if bundled.french && bundled.year_format != "dash" && !bundled.year_prefix
|
|
54
|
+
# Convert 4-digit year back to 2-digit
|
|
55
|
+
year_str = bundled.year.to_s
|
|
56
|
+
bundled_part += if year_str.length == 4 && year_str.start_with?("20")
|
|
57
|
+
year_str[2..3]
|
|
58
|
+
else
|
|
59
|
+
year_str
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
else
|
|
63
|
+
# Standard rendering for other identifier types
|
|
64
|
+
bundled_part = ""
|
|
65
|
+
bundled_part += bundled.code.to_s if bundled.code
|
|
66
|
+
|
|
67
|
+
if bundled.year
|
|
68
|
+
# Use dash if year_format is dash, otherwise colon
|
|
69
|
+
separator = bundled.year_format == "dash" ? "-" : ":"
|
|
70
|
+
bundled_part += separator
|
|
71
|
+
bundled_part += bundled.year_prefix if bundled.year_prefix # Add M or F prefix
|
|
72
|
+
bundled_part += "F" if bundled.french && bundled.year_format != "dash" && !bundled.year_prefix # Only add F if no prefix
|
|
73
|
+
# Convert 4-digit year back to 2-digit
|
|
74
|
+
# Use original_year_4digit flag to determine original format
|
|
75
|
+
year_str = bundled.year.to_s
|
|
76
|
+
bundled_part += if bundled.class.attributes.key?(:original_year_4digit) && bundled.original_year_4digit
|
|
77
|
+
# Preserve 4-digit format
|
|
78
|
+
year_str
|
|
79
|
+
elsif year_str.length == 4 && year_str.start_with?("20")
|
|
80
|
+
# 2000s → convert to 2-digit
|
|
81
|
+
year_str[2..3]
|
|
82
|
+
elsif year_str.length == 4 && year_str.start_with?("19") && bundled.class.attributes.key?(:original_year_4digit) && !bundled.original_year_4digit
|
|
83
|
+
# 1900s with no M/F prefix, but original was 2-digit (e.g., bundled identifier)
|
|
84
|
+
# Convert back to 2-digit
|
|
85
|
+
year_str[2..3]
|
|
86
|
+
else
|
|
87
|
+
# Other formats - keep as-is
|
|
88
|
+
year_str
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
parts << bundled_part
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
result = parts.join(" + ")
|
|
98
|
+
|
|
99
|
+
# Reaffirmation - preserve original format and determine spacing
|
|
100
|
+
if reaffirmation
|
|
101
|
+
# For bundled identifiers, check year format from base identifier
|
|
102
|
+
# to determine spacing
|
|
103
|
+
year_was_2digit = base.class.attributes.key?(:original_year_4digit) && !base.original_year_4digit
|
|
104
|
+
|
|
105
|
+
# Check if reaffirmation was originally 4-digit
|
|
106
|
+
# Note: We need to track this at the Bundled level, but for now
|
|
107
|
+
# assume 4-digit if the value is 4 digits and starts with 19/20
|
|
108
|
+
reaffirmation_was_4digit = reaffirmation.to_s.length == 4 &&
|
|
109
|
+
reaffirmation.to_s.start_with?("19", "20")
|
|
110
|
+
|
|
111
|
+
# Determine spacing based on original formats
|
|
112
|
+
# Space needed if year is 2-digit and reaffirmation is 4-digit
|
|
113
|
+
result += if year_was_2digit && reaffirmation_was_4digit
|
|
114
|
+
" (R#{reaffirmation})"
|
|
115
|
+
else
|
|
116
|
+
"(R#{reaffirmation})"
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
result
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Csa
|
|
5
|
+
module Identifiers
|
|
6
|
+
# CanadianAdoptedIdentifier represents Canadian adoption of standards
|
|
7
|
+
# indicated by the CAN/ prefix wrapper.
|
|
8
|
+
#
|
|
9
|
+
# Examples:
|
|
10
|
+
# CAN/CSA-C22.2 NO. 60601-1-9:15
|
|
11
|
+
# CAN/CSA-Z662:23 (R2024)
|
|
12
|
+
#
|
|
13
|
+
# This is a wrapper pattern where:
|
|
14
|
+
# - CAN/ indicates Canadian adoption
|
|
15
|
+
# - The wrapped_identifier is the actual CSA standard being adopted
|
|
16
|
+
#
|
|
17
|
+
# This is semantically different from a string prefix because:
|
|
18
|
+
# - CAN/ wraps an entire identifier (which may itself be complex)
|
|
19
|
+
# - The wrapped identifier is recursively parsed as a full CSA identifier
|
|
20
|
+
# - Proper object composition, not string manipulation
|
|
21
|
+
class CanadianAdopted < WrapperIdentifier
|
|
22
|
+
def to_s
|
|
23
|
+
# For CAN3- identifiers, don't add CAN/ prefix (CAN3- is already complete)
|
|
24
|
+
# For Series with CAN/CSA- prefix, don't add CAN/ (it's already complete)
|
|
25
|
+
# For CAN/CSA- identifiers, CAN/ wraps CSA- part
|
|
26
|
+
if wrapped_identifier.class.attributes.key?(:publisher_prefix) && wrapped_identifier.publisher_prefix
|
|
27
|
+
prefix = wrapped_identifier.publisher_prefix
|
|
28
|
+
# CAN3- is standalone, just render wrapped identifier
|
|
29
|
+
# CAN/CSA- is already complete for Series identifiers
|
|
30
|
+
if prefix == "CAN3-" || (prefix == "CAN/CSA-" && wrapped_identifier.is_a?(Identifiers::Series))
|
|
31
|
+
result = wrapped_identifier.to_s
|
|
32
|
+
else
|
|
33
|
+
# For other cases, prepend CAN/ prefix
|
|
34
|
+
result = "CAN/#{wrapped_identifier}"
|
|
35
|
+
end
|
|
36
|
+
else
|
|
37
|
+
# No publisher_prefix, prepend CAN/
|
|
38
|
+
result = "CAN/#{wrapped_identifier}"
|
|
39
|
+
end
|
|
40
|
+
# Only add reaffirmation from wrapper if wrapped_identifier doesn't have one
|
|
41
|
+
# (to avoid duplicates - Identifier.parse sets it on both)
|
|
42
|
+
if reaffirmation && !(wrapped_identifier.class.attributes.key?(:reaffirmation) && wrapped_identifier.reaffirmation)
|
|
43
|
+
# Determine if space is needed before reaffirmation
|
|
44
|
+
# Space needed if year is 2-digit and reaffirmation is 4-digit (original format)
|
|
45
|
+
# No space if both year and reaffirmation are 2-digit
|
|
46
|
+
# Check original_year_4digit flag - if false, year was originally 2-digit
|
|
47
|
+
year_was_2digit = wrapped_identifier.class.attributes.key?(:original_year_4digit) &&
|
|
48
|
+
!wrapped_identifier.original_year_4digit
|
|
49
|
+
# Check original_reaffirmation_4digit flag
|
|
50
|
+
reaffirmation_was_4digit = original_reaffirmation_4digit
|
|
51
|
+
|
|
52
|
+
# Preserve original reaffirmation format
|
|
53
|
+
# If original was 4-digit, keep as 4-digit
|
|
54
|
+
# If original was 2-digit, convert from 4-digit storage back to 2-digit
|
|
55
|
+
reaffirmation_str = if reaffirmation_was_4digit
|
|
56
|
+
# Original was 4-digit, keep as-is
|
|
57
|
+
reaffirmation.to_s
|
|
58
|
+
elsif reaffirmation.to_s.length == 4 && reaffirmation.to_s.start_with?(
|
|
59
|
+
"19", "20"
|
|
60
|
+
)
|
|
61
|
+
# Original was 2-digit, convert 4-digit storage back to 2-digit
|
|
62
|
+
# (R2004) → (R04), (R1994) → (R94)
|
|
63
|
+
reaffirmation.to_s[2..3]
|
|
64
|
+
else
|
|
65
|
+
# Already 2-digit or other format
|
|
66
|
+
reaffirmation.to_s
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
if year_was_2digit && reaffirmation_was_4digit
|
|
70
|
+
# Year was 2-digit, reaffirmation was 4-digit → add space
|
|
71
|
+
result += " (R#{reaffirmation_str})"
|
|
72
|
+
else
|
|
73
|
+
# Both 2-digit or other cases → no space
|
|
74
|
+
result += "(R#{reaffirmation_str})"
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
result
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Csa
|
|
5
|
+
module Identifiers
|
|
6
|
+
# Canadian Electrical Code (CEC) identifier
|
|
7
|
+
# Pattern: CSA C22.{2,3,4,6} NO. {number}:{year}
|
|
8
|
+
# Examples: CSA C22.2 NO. 286:23, CSA C22.3 NO. 7:20
|
|
9
|
+
#
|
|
10
|
+
# The "NO." indicates a numbered standard within the C22.x series
|
|
11
|
+
# and must be preserved (not normalized) as a semantic component.
|
|
12
|
+
class Cec < SingleIdentifier
|
|
13
|
+
attribute :cec_part, Components::Code # C22.2, C22.3, C22.4, C22.6
|
|
14
|
+
attribute :no_number, Components::Code # Number after NO.
|
|
15
|
+
|
|
16
|
+
# Combined code attribute for compatibility
|
|
17
|
+
# Returns cec_part + "-" + no_number (e.g., "C22.2-1")
|
|
18
|
+
def code
|
|
19
|
+
return nil unless cec_part && no_number
|
|
20
|
+
|
|
21
|
+
@code ||= Components::Code.new(value: "#{cec_part.value}-#{no_number.value}")
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def to_s
|
|
25
|
+
parts = []
|
|
26
|
+
|
|
27
|
+
# Publisher prefix (CSA, CAN/CSA-, CAN3-)
|
|
28
|
+
prefix = publisher_prefix || "CSA"
|
|
29
|
+
|
|
30
|
+
# Determine if we need space after prefix
|
|
31
|
+
# CAN/CSA- and CAN3- end with dash, so no space needed
|
|
32
|
+
needs_space = !prefix.end_with?("-")
|
|
33
|
+
|
|
34
|
+
parts << prefix unless prefix == ""
|
|
35
|
+
|
|
36
|
+
# CEC Part (C22.2, C22.3, etc.)
|
|
37
|
+
parts << cec_part.value if cec_part
|
|
38
|
+
|
|
39
|
+
# NO. notation - this is the key semantic component
|
|
40
|
+
parts << "NO."
|
|
41
|
+
|
|
42
|
+
# Number after NO.
|
|
43
|
+
parts << no_number.value if no_number
|
|
44
|
+
|
|
45
|
+
# Determine separator based on prefix ending
|
|
46
|
+
result = if prefix == ""
|
|
47
|
+
parts.join(" ")
|
|
48
|
+
elsif needs_space
|
|
49
|
+
parts.join(" ")
|
|
50
|
+
elsif parts.length <= 2
|
|
51
|
+
# No space after dash-ending prefix (CAN/CSA-, CAN3-)
|
|
52
|
+
# Join first two parts directly, rest with spaces
|
|
53
|
+
parts.join
|
|
54
|
+
else
|
|
55
|
+
parts[0] + parts[1..].join(" ")
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Year with proper format (colon or dash)
|
|
59
|
+
if year
|
|
60
|
+
# Use dash if year_format is dash, otherwise colon
|
|
61
|
+
separator = year_format == "dash" ? "-" : ":"
|
|
62
|
+
year_part = separator
|
|
63
|
+
|
|
64
|
+
# Convert 4-digit year back to 2-digit for display
|
|
65
|
+
year_str = year.to_s
|
|
66
|
+
display_year = if year_str.length == 4 && year_str.start_with?("20")
|
|
67
|
+
year_str[2..3]
|
|
68
|
+
elsif year_str.length == 4 && year_str.start_with?("19")
|
|
69
|
+
year_str[2..3]
|
|
70
|
+
else
|
|
71
|
+
year_str
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Add prefix if present
|
|
75
|
+
year_part += if year_prefix
|
|
76
|
+
year_prefix + display_year
|
|
77
|
+
elsif french && year_format != "dash"
|
|
78
|
+
# Only add F if no prefix already set
|
|
79
|
+
"F#{display_year}"
|
|
80
|
+
else
|
|
81
|
+
display_year
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
result += year_part
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Reaffirmation - preserve original format and determine spacing
|
|
88
|
+
if reaffirmation
|
|
89
|
+
# Check if year was originally 2-digit (original_year_4digit flag)
|
|
90
|
+
year_was_2digit = !original_year_4digit
|
|
91
|
+
|
|
92
|
+
# Check if reaffirmation was originally 4-digit (original_reaffirmation_4digit flag)
|
|
93
|
+
reaffirmation_was_4digit = original_reaffirmation_4digit
|
|
94
|
+
|
|
95
|
+
# Preserve original reaffirmation format
|
|
96
|
+
# If original was 4-digit, keep as 4-digit
|
|
97
|
+
# If original was 2-digit, convert from 4-digit storage back to 2-digit
|
|
98
|
+
reaffirmation_str = if reaffirmation_was_4digit
|
|
99
|
+
# Original was 4-digit, keep as-is
|
|
100
|
+
reaffirmation.to_s
|
|
101
|
+
elsif reaffirmation.to_s.length == 4 && reaffirmation.to_s.start_with?(
|
|
102
|
+
"19", "20"
|
|
103
|
+
)
|
|
104
|
+
# Original was 2-digit, convert 4-digit storage back to 2-digit
|
|
105
|
+
# (R2004) → (R04), (R1994) → (R94)
|
|
106
|
+
reaffirmation.to_s[2..3]
|
|
107
|
+
else
|
|
108
|
+
# Already 2-digit or other format
|
|
109
|
+
reaffirmation.to_s
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Determine spacing based on original formats
|
|
113
|
+
# Space needed if year is 2-digit and reaffirmation is 4-digit (original format)
|
|
114
|
+
# No space if both year and reaffirmation are 2-digit, or both are 4-digit
|
|
115
|
+
if year_was_2digit && reaffirmation_was_4digit
|
|
116
|
+
# Year was 2-digit, reaffirmation was 4-digit → add space
|
|
117
|
+
result += " (R#{reaffirmation_str})"
|
|
118
|
+
else
|
|
119
|
+
# Both 2-digit, both 4-digit, or other cases → no space
|
|
120
|
+
result += "(R#{reaffirmation_str})"
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
result
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
end
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "lutaml/model"
|
|
4
|
+
|
|
5
|
+
module Pubid
|
|
6
|
+
module Csa
|
|
7
|
+
module Identifiers
|
|
8
|
+
# CombinedIdentifier represents CSA identifiers combined with "/" separator
|
|
9
|
+
# Examples:
|
|
10
|
+
# CSA A23.1:24/CSA A23.2:24
|
|
11
|
+
# CSA N285.0:23/CSA N285.6 SERIES:23
|
|
12
|
+
# CSA A123.1-05/A123.5-05 (R2015)
|
|
13
|
+
# CSA B44:19/B44.1:19/B44.2:19 (triple combined)
|
|
14
|
+
class Combined < Lutaml::Model::Serializable
|
|
15
|
+
attribute :first, Standard
|
|
16
|
+
attribute :second, Standard
|
|
17
|
+
attribute :third, Standard
|
|
18
|
+
attribute :reaffirmation, :string
|
|
19
|
+
attribute :original_reaffirmation_4digit, :boolean, default: -> {
|
|
20
|
+
false
|
|
21
|
+
}
|
|
22
|
+
attribute :package, :string
|
|
23
|
+
attribute :year_format, :string # Dummy for compatibility
|
|
24
|
+
attribute :separator, :string, default: -> { "/" } # "/" or ", "
|
|
25
|
+
|
|
26
|
+
def to_s
|
|
27
|
+
# For comma separator, render both parts with full prefix
|
|
28
|
+
# For slash separator, second/third parts without prefix
|
|
29
|
+
if separator == ", "
|
|
30
|
+
# Comma: Both with full CSA prefix
|
|
31
|
+
parts = [first.to_s, second.to_s]
|
|
32
|
+
parts << third.to_s if third
|
|
33
|
+
else
|
|
34
|
+
# Slash: Second and third without CSA prefix (continuation)
|
|
35
|
+
parts = [first.to_s]
|
|
36
|
+
parts << render_continuation(second)
|
|
37
|
+
parts << render_continuation(third) if third
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
result = parts.join(separator || "/")
|
|
41
|
+
|
|
42
|
+
# Reaffirmation - preserve original format and determine spacing
|
|
43
|
+
if reaffirmation
|
|
44
|
+
# For combined identifiers, check year format from first identifier
|
|
45
|
+
# to determine spacing
|
|
46
|
+
year_was_2digit = first.class.attributes.key?(:original_year_4digit) && !first.original_year_4digit
|
|
47
|
+
|
|
48
|
+
# Check if reaffirmation was originally 4-digit
|
|
49
|
+
# Note: We need to track this at the Combined level, but for now
|
|
50
|
+
# assume 4-digit if the value is 4 digits and starts with 19/20
|
|
51
|
+
reaffirmation_was_4digit = reaffirmation.to_s.length == 4 &&
|
|
52
|
+
reaffirmation.to_s.start_with?("19", "20")
|
|
53
|
+
|
|
54
|
+
# Determine spacing based on original formats
|
|
55
|
+
# Space needed if year is 2-digit and reaffirmation is 4-digit
|
|
56
|
+
result += if year_was_2digit && reaffirmation_was_4digit
|
|
57
|
+
" (R#{reaffirmation})"
|
|
58
|
+
else
|
|
59
|
+
"(R#{reaffirmation})"
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
result += package if package
|
|
64
|
+
result
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
private
|
|
68
|
+
|
|
69
|
+
# Render identifier without CSA prefix (unless has_publisher is true)
|
|
70
|
+
def render_continuation(identifier)
|
|
71
|
+
parts = []
|
|
72
|
+
|
|
73
|
+
# Add CSA prefix if present in original
|
|
74
|
+
if identifier.has_publisher
|
|
75
|
+
prefix = identifier.publisher_prefix || "CSA"
|
|
76
|
+
!prefix.end_with?("-")
|
|
77
|
+
parts << prefix
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
code_part = identifier.code.to_s if identifier.code
|
|
81
|
+
|
|
82
|
+
# NO. keyword
|
|
83
|
+
if identifier.no_number
|
|
84
|
+
code_part += " NO. #{identifier.no_number}"
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Series prefix and keyword (before year)
|
|
88
|
+
if identifier.series_prefix
|
|
89
|
+
code_part += " #{identifier.series_prefix} SERIES"
|
|
90
|
+
elsif identifier.series
|
|
91
|
+
# SERIES without prefix
|
|
92
|
+
code_part += " SERIES"
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# Year with proper format (colon or dash)
|
|
96
|
+
if identifier.year
|
|
97
|
+
separator = identifier.year_format == "dash" ? "-" : ":"
|
|
98
|
+
year_part = separator
|
|
99
|
+
year_part += identifier.year_prefix if identifier.year_prefix # Add M or F prefix
|
|
100
|
+
year_part += "F" if identifier.french && identifier.year_format != "dash" && !identifier.year_prefix # Only add F if no prefix
|
|
101
|
+
# Convert 4-digit year back to 2-digit
|
|
102
|
+
year_str = identifier.year.to_s
|
|
103
|
+
year_part += if year_str.length == 4 && year_str.start_with?("20")
|
|
104
|
+
year_str[2..3]
|
|
105
|
+
else
|
|
106
|
+
year_str
|
|
107
|
+
end
|
|
108
|
+
code_part += year_part
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
parts << code_part if code_part
|
|
112
|
+
|
|
113
|
+
# Join with proper spacing based on prefix
|
|
114
|
+
if identifier.has_publisher && parts.length > 1
|
|
115
|
+
prefix = parts[0]
|
|
116
|
+
needs_space = !prefix.end_with?("-")
|
|
117
|
+
if needs_space
|
|
118
|
+
parts.join(" ")
|
|
119
|
+
else
|
|
120
|
+
# No space after dash-ending prefix
|
|
121
|
+
parts[0] + parts[1..].join(" ")
|
|
122
|
+
end
|
|
123
|
+
else
|
|
124
|
+
parts.join(" ")
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Csa
|
|
5
|
+
module Identifiers
|
|
6
|
+
# CsaAdoptedIdentifier represents CSA adoption of international standards
|
|
7
|
+
# (ISO, IEC, ISO/IEC, CISPR, etc.)
|
|
8
|
+
#
|
|
9
|
+
# Examples:
|
|
10
|
+
# CSA ISO/IEC TR 12785-3:15
|
|
11
|
+
# CSA ISO/IEC TR 19758:04 (R2024)
|
|
12
|
+
# CSA CISPR 16-1-1:18
|
|
13
|
+
# CSA-ISO 10012:03 (when wrapped by CanadianAdopted)
|
|
14
|
+
#
|
|
15
|
+
# Key difference from CanadianAdopted:
|
|
16
|
+
# - CsaAdopted wraps ISO/IEC/CISPR standards (external)
|
|
17
|
+
# - CanadianAdopted wraps CSA standards (internal)
|
|
18
|
+
#
|
|
19
|
+
# This is a wrapper pattern where:
|
|
20
|
+
# - CSA prefix indicates adoption
|
|
21
|
+
# - The wrapped_identifier is the external standard (ISO/IEC/CISPR)
|
|
22
|
+
# - Wrapped identifier is recursively parsed using external flavor parsers
|
|
23
|
+
class CsaAdopted < WrapperIdentifier
|
|
24
|
+
# Publisher prefix (e.g., "CSA-", "CAN3-") for rendering
|
|
25
|
+
# When set, uses dash format without space (e.g., "CSA-ISO" not "CSA ISO")
|
|
26
|
+
attribute :publisher_prefix, :string
|
|
27
|
+
|
|
28
|
+
def to_s
|
|
29
|
+
# Get string representation from wrapped identifier
|
|
30
|
+
base_str = wrapped_identifier.to_s
|
|
31
|
+
|
|
32
|
+
# Convert 4-digit years to 2-digit for CSA adoption format
|
|
33
|
+
# ISO/IEC TR 12785-3:2015 → ISO/IEC TR 12785-3:15
|
|
34
|
+
# Also handle amendment years: /Amd 1:2022 → /A1:22
|
|
35
|
+
if base_str =~ /:(\d{4})\b/
|
|
36
|
+
year = $1
|
|
37
|
+
if year.start_with?("20")
|
|
38
|
+
short_year = year[2..3]
|
|
39
|
+
base_str = base_str.sub(":#{year}", ":#{short_year}")
|
|
40
|
+
elsif year.start_with?("19")
|
|
41
|
+
# Handle 1900s years: 1998 → 98
|
|
42
|
+
short_year = year[2..3]
|
|
43
|
+
base_str = base_str.sub(":#{year}", ":#{short_year}")
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Convert ISO/IEC amendment format to CSA format
|
|
48
|
+
# /Amd 1:22 → /A1:22, /Amd 1-22 → /A1-22
|
|
49
|
+
# Handle both 2-digit and 4-digit years
|
|
50
|
+
base_str = base_str.gsub(%r{/Amd\s+(\d+)([:/-])(\d{2,4})\b}) do |_match|
|
|
51
|
+
amendment_num = $1
|
|
52
|
+
separator = $2
|
|
53
|
+
amend_year = $3
|
|
54
|
+
# Convert 4-digit year to 2-digit if needed
|
|
55
|
+
if amend_year.length == 4 && amend_year.start_with?("20", "19")
|
|
56
|
+
amend_year = amend_year[2..3]
|
|
57
|
+
end
|
|
58
|
+
"/A#{amendment_num}#{separator}#{amend_year}"
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Apply publisher prefix format
|
|
62
|
+
# If publisher_prefix is "CSA-", render as "CSA-ISO..." (no space)
|
|
63
|
+
# Otherwise render as "CSA ISO..." (with space)
|
|
64
|
+
result = if publisher_prefix&.end_with?("-")
|
|
65
|
+
"#{publisher_prefix}#{base_str}"
|
|
66
|
+
else
|
|
67
|
+
"CSA #{base_str}"
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Append reaffirmation if present
|
|
71
|
+
result += " (R#{reaffirmation})" if reaffirmation
|
|
72
|
+
|
|
73
|
+
result
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Csa
|
|
5
|
+
module Identifiers
|
|
6
|
+
# PackageIdentifier represents CSA standards sold as packages
|
|
7
|
+
# with additional materials (PDF, print, addenda, etc.)
|
|
8
|
+
#
|
|
9
|
+
# Examples:
|
|
10
|
+
# CSA Z662:23 PACKAGE INCLUDES: +1 (PDF & ESA)
|
|
11
|
+
# CSA B149.1:20 PACKAGE (PDF + PRINT)
|
|
12
|
+
# CSA C22.2 NO. 60601-1:15 PACKAGE WITH ADDENDUM
|
|
13
|
+
#
|
|
14
|
+
# This is a composite pattern where:
|
|
15
|
+
# - base_identifier is the core CSA standard (recursively parsed)
|
|
16
|
+
# - package_materials describes what's included in the package
|
|
17
|
+
# - Package portion is metadata, not a parseable identifier
|
|
18
|
+
#
|
|
19
|
+
# Difference from BundledIdentifier:
|
|
20
|
+
# - Package: Single base + materials metadata
|
|
21
|
+
# - Bundled: Multiple identifiers consolidated together
|
|
22
|
+
class Package < CompositeIdentifier
|
|
23
|
+
# Package materials/contents description
|
|
24
|
+
# Examples: "INCLUDES: +1 (PDF & ESA)", "(PDF + PRINT)", "WITH ADDENDUM"
|
|
25
|
+
attribute :package_materials, :string
|
|
26
|
+
|
|
27
|
+
# Package keyword variant (for future extensibility)
|
|
28
|
+
# Usually "PACKAGE" but could be variations
|
|
29
|
+
attribute :package_keyword, :string
|
|
30
|
+
|
|
31
|
+
# Track whether materials come before or after PACKAGE keyword
|
|
32
|
+
# true = materials AFTER: "CSA Z662:23 PACKAGE INCLUDES: +1"
|
|
33
|
+
# false = materials BEFORE: "CSA B149.1:25 Code, Handbook & Training Package"
|
|
34
|
+
attribute :materials_after_keyword, :boolean, default: -> { true }
|
|
35
|
+
|
|
36
|
+
def to_s
|
|
37
|
+
result = base_identifier.to_s
|
|
38
|
+
|
|
39
|
+
# Add package materials if present
|
|
40
|
+
if package_materials && !package_materials.empty?
|
|
41
|
+
if materials_after_keyword
|
|
42
|
+
# Format: {base} PACKAGE {materials}
|
|
43
|
+
result += " PACKAGE"
|
|
44
|
+
result += " #{package_materials}"
|
|
45
|
+
elsif package_materials.match?(/\sPACKAGE\s*$/i)
|
|
46
|
+
# Format: {base} {materials} PACKAGE
|
|
47
|
+
# Check if materials already end with "Package" (to preserve exact capitalization)
|
|
48
|
+
# Materials already include the Package suffix
|
|
49
|
+
result += " #{package_materials}"
|
|
50
|
+
else
|
|
51
|
+
# Add Package suffix (use the package_keyword value)
|
|
52
|
+
result += " #{package_materials}"
|
|
53
|
+
result += " #{package_keyword}"
|
|
54
|
+
end
|
|
55
|
+
else
|
|
56
|
+
# No materials, just add PACKAGE keyword
|
|
57
|
+
result += " PACKAGE"
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
result
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|