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,211 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Rendering
|
|
5
|
+
# Common rendering methods for identifier string representation
|
|
6
|
+
#
|
|
7
|
+
# This module extracts duplicated rendering logic across flavors
|
|
8
|
+
# to reduce code duplication and ensure consistency.
|
|
9
|
+
#
|
|
10
|
+
# == Usage
|
|
11
|
+
#
|
|
12
|
+
# Include this module in flavor-specific identifier base classes:
|
|
13
|
+
#
|
|
14
|
+
# class Base < ::Pubid::Identifier
|
|
15
|
+
# include Pubid::Rendering::Common
|
|
16
|
+
#
|
|
17
|
+
# def to_s(lang: :en, lang_single: false, with_edition: false)
|
|
18
|
+
# render_identifier(lang: lang, lang_single: lang_single, with_edition: with_edition)
|
|
19
|
+
# end
|
|
20
|
+
# end
|
|
21
|
+
#
|
|
22
|
+
module Common
|
|
23
|
+
# Render publisher with optional copublishers
|
|
24
|
+
#
|
|
25
|
+
# @param publisher [Components::Publisher] publisher component
|
|
26
|
+
# @param copublisher_separator [String] separator for copublishers (default: "/")
|
|
27
|
+
# @return [String] formatted publisher string
|
|
28
|
+
def render_publisher(publisher, copublisher_separator: "/")
|
|
29
|
+
return "" unless publisher
|
|
30
|
+
|
|
31
|
+
result = publisher.to_s
|
|
32
|
+
cops = publisher.is_a?(Components::Publisher) ? publisher.copublisher : nil
|
|
33
|
+
if cops&.any?
|
|
34
|
+
result += cops.map do |cp|
|
|
35
|
+
"#{copublisher_separator}#{cp}"
|
|
36
|
+
end.join
|
|
37
|
+
end
|
|
38
|
+
result
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Render stage and type abbreviations with proper separators
|
|
42
|
+
#
|
|
43
|
+
# @param stage [Components::Stage] stage component
|
|
44
|
+
# @param type [Components::Type] type component
|
|
45
|
+
# @param has_copublisher [Boolean] whether identifier has copublisher
|
|
46
|
+
# @param default_type_abbr [String] default type abbreviation to skip (default: "IS")
|
|
47
|
+
# @param stage_separator [String] separator before stage without copublisher
|
|
48
|
+
# @return [String] formatted stage/type string
|
|
49
|
+
def render_stage_type(stage, type, has_copublisher: false,
|
|
50
|
+
default_type_abbr: "IS",
|
|
51
|
+
stage_separator: "/")
|
|
52
|
+
result = ""
|
|
53
|
+
|
|
54
|
+
# Add stage abbreviation if present
|
|
55
|
+
if stage&.abbr
|
|
56
|
+
sep = has_copublisher ? " " : stage_separator
|
|
57
|
+
result += "#{sep}#{stage.abbr}"
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Add type abbreviation if present and not default
|
|
61
|
+
if type&.abbr && type.abbr != default_type_abbr
|
|
62
|
+
# Separator: space after stage or copublisher, slash otherwise
|
|
63
|
+
has_prefix = stage&.abbr || has_copublisher
|
|
64
|
+
sep = has_prefix ? " " : stage_separator
|
|
65
|
+
result += "#{sep}#{type.abbr}"
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
result
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# Render number with optional parts
|
|
72
|
+
#
|
|
73
|
+
# @param number [Components::Code] primary number component
|
|
74
|
+
# @param part [Components::Code] optional part component
|
|
75
|
+
# @param subpart [Components::Code] optional subpart component
|
|
76
|
+
# @param part_separator [String] separator for parts (default: "-")
|
|
77
|
+
# @return [String] formatted numbering string
|
|
78
|
+
def render_numbering(number, part = nil, subpart = nil,
|
|
79
|
+
part_separator: "-")
|
|
80
|
+
return "" unless number&.value
|
|
81
|
+
|
|
82
|
+
result = " #{number.value}"
|
|
83
|
+
result += "#{part_separator}#{part.value}" if part&.value
|
|
84
|
+
result += "#{part_separator}#{subpart.value}" if subpart&.value
|
|
85
|
+
result
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Render stage iteration (e.g., ".1" for stage iteration)
|
|
89
|
+
#
|
|
90
|
+
# @param stage_iteration [Components::Code] stage iteration component
|
|
91
|
+
# @return [String] formatted stage iteration or empty string
|
|
92
|
+
def render_stage_iteration(stage_iteration)
|
|
93
|
+
stage_iteration&.value ? ".#{stage_iteration.value}" : ""
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# Render date with optional year/month/day
|
|
97
|
+
#
|
|
98
|
+
# @param date [Components::Date] date component
|
|
99
|
+
# @param include_month [Boolean] include month in output
|
|
100
|
+
# @param date_separator [String] separator for date parts (default: "-")
|
|
101
|
+
# @return [String] formatted date string or empty string
|
|
102
|
+
def render_date(date, include_month: false, date_separator: "-")
|
|
103
|
+
return "" unless date&.year
|
|
104
|
+
|
|
105
|
+
result = ":#{date.year}"
|
|
106
|
+
if date.month && include_month
|
|
107
|
+
result += "#{date_separator}#{format('%02d', date.month)}"
|
|
108
|
+
result += "#{date_separator}#{format('%02d', date.day)}" if date.day
|
|
109
|
+
end
|
|
110
|
+
result
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# Render language codes
|
|
114
|
+
#
|
|
115
|
+
# @param languages [Array<Components::Language>] language components
|
|
116
|
+
# @param lang_single [Boolean] use single character format
|
|
117
|
+
# @param lang_separator [String] separator between languages (default: "/")
|
|
118
|
+
# @return [String] formatted language string or empty string
|
|
119
|
+
def render_languages(languages, lang_single: false, lang_separator: "/")
|
|
120
|
+
return "" unless languages&.any?
|
|
121
|
+
|
|
122
|
+
formatted = languages.map do |l|
|
|
123
|
+
l.to_s(lang_single: lang_single)
|
|
124
|
+
end.join(lang_separator)
|
|
125
|
+
"(#{formatted})"
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# Render edition component
|
|
129
|
+
#
|
|
130
|
+
# @param edition [Components::Edition] edition component
|
|
131
|
+
# @param with_prefix [Boolean] include prefix (default: true)
|
|
132
|
+
# @return [String] formatted edition string or empty string
|
|
133
|
+
def render_edition(edition, with_prefix: true)
|
|
134
|
+
return "" unless edition
|
|
135
|
+
|
|
136
|
+
if with_prefix
|
|
137
|
+
edition.to_s
|
|
138
|
+
else
|
|
139
|
+
" #{edition}"
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
# Check if publisher has copublishers
|
|
144
|
+
#
|
|
145
|
+
# @param publisher [Components::Publisher] publisher component
|
|
146
|
+
# @return [Boolean] true if has copublishers
|
|
147
|
+
def publisher_has_copublisher?(publisher)
|
|
148
|
+
publisher.is_a?(Components::Publisher) && publisher.has_copublisher?
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
# Get publisher body/name
|
|
152
|
+
#
|
|
153
|
+
# @param publisher [Components::Publisher] publisher component
|
|
154
|
+
# @return [String] publisher body
|
|
155
|
+
def publisher_body(publisher)
|
|
156
|
+
publisher.is_a?(Components::Publisher) ? publisher.body : publisher.to_s
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
# Get copublishers as array
|
|
160
|
+
#
|
|
161
|
+
# @param publisher [Components::Publisher] publisher component
|
|
162
|
+
# @return [Array<String>] array of copublisher names
|
|
163
|
+
def copublishers_list(publisher)
|
|
164
|
+
return [] unless publisher.is_a?(Components::Publisher) && publisher.copublisher&.any?
|
|
165
|
+
|
|
166
|
+
publisher.copublisher.map { |cp| publisher_body(cp) }
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
# Render full identifier with all components
|
|
170
|
+
#
|
|
171
|
+
# This is a convenience method that combines all rendering methods
|
|
172
|
+
# in the standard order for most identifier types.
|
|
173
|
+
#
|
|
174
|
+
# @param publisher [Components::Publisher] publisher component
|
|
175
|
+
# @param stage [Components::Stage] stage component
|
|
176
|
+
# @param type [Components::Type] type component
|
|
177
|
+
# @param number [Components::Code] number component
|
|
178
|
+
# @param part [Components::Code] part component
|
|
179
|
+
# @param subpart [Components::Code] subpart component
|
|
180
|
+
# @param stage_iteration [Components::Code] stage iteration component
|
|
181
|
+
# @param date [Components::Date] date component
|
|
182
|
+
# @param edition [Components::Edition] edition component
|
|
183
|
+
# @param languages [Array<Components::Language>] language components
|
|
184
|
+
# @param lang [Symbol] language for rendering (:en or :fr)
|
|
185
|
+
# @param lang_single [Boolean] use single char language format
|
|
186
|
+
# @param with_edition [Boolean] include edition in output
|
|
187
|
+
# @param default_type_abbr [String] default type abbreviation to skip
|
|
188
|
+
# @return [String] formatted identifier string
|
|
189
|
+
def render_full_identifier(publisher:, stage: nil, type: nil,
|
|
190
|
+
number: nil, part: nil, subpart: nil,
|
|
191
|
+
stage_iteration: nil, date: nil,
|
|
192
|
+
edition: nil, languages: nil,
|
|
193
|
+
lang: :en, lang_single: false,
|
|
194
|
+
with_edition: false,
|
|
195
|
+
default_type_abbr: "IS")
|
|
196
|
+
result = render_publisher(publisher)
|
|
197
|
+
result += render_stage_type(stage, type,
|
|
198
|
+
has_copublisher: publisher_has_copublisher?(
|
|
199
|
+
publisher,
|
|
200
|
+
),
|
|
201
|
+
default_type_abbr: default_type_abbr)
|
|
202
|
+
result += render_numbering(number, part, subpart)
|
|
203
|
+
result += render_stage_iteration(stage_iteration) if stage_iteration
|
|
204
|
+
result += render_date(date)
|
|
205
|
+
result += render_edition(edition) if with_edition && edition
|
|
206
|
+
result += render_languages(languages, lang_single: lang_single)
|
|
207
|
+
result
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
end
|
|
211
|
+
end
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Rendering
|
|
5
|
+
# Context object for flavor-specific rendering rules
|
|
6
|
+
#
|
|
7
|
+
# This encapsulates the rendering rules that vary between flavors,
|
|
8
|
+
# allowing components to render themselves correctly based on context.
|
|
9
|
+
#
|
|
10
|
+
# == Usage
|
|
11
|
+
#
|
|
12
|
+
# context = RenderingContext.new(
|
|
13
|
+
# stage_separator: "/",
|
|
14
|
+
# stage_separator_with_copublisher: " ",
|
|
15
|
+
# type_separator: "/",
|
|
16
|
+
# type_separator_with_prefix: " ",
|
|
17
|
+
# default_type_abbr: "IS"
|
|
18
|
+
# )
|
|
19
|
+
# identifier.to_s(context: context)
|
|
20
|
+
#
|
|
21
|
+
class RenderingContext
|
|
22
|
+
attr_reader :stage_separator, :stage_separator_with_copublisher,
|
|
23
|
+
:type_separator, :type_separator_with_prefix,
|
|
24
|
+
:default_type_abbr, :lang, :lang_single,
|
|
25
|
+
:with_language_code, :stage_format_long, :with_date,
|
|
26
|
+
:annotated
|
|
27
|
+
|
|
28
|
+
# Initialize a new rendering context
|
|
29
|
+
#
|
|
30
|
+
# @param stage_separator [String] separator before stage without copublisher
|
|
31
|
+
# @param stage_separator_with_copublisher [String] separator before stage with copublisher
|
|
32
|
+
# @param type_separator [String] separator before type (default)
|
|
33
|
+
# @param type_separator_with_prefix [String] separator before type when prefix exists
|
|
34
|
+
# @param default_type_abbr [String] default type abbreviation to skip rendering
|
|
35
|
+
# @param lang [Symbol] language for rendering (:en or :fr)
|
|
36
|
+
# @param lang_single [Boolean] use single char language format
|
|
37
|
+
def initialize(stage_separator: "/",
|
|
38
|
+
stage_separator_with_copublisher: " ",
|
|
39
|
+
type_separator: "/",
|
|
40
|
+
type_separator_with_prefix: " ",
|
|
41
|
+
default_type_abbr: "IS",
|
|
42
|
+
lang: :en,
|
|
43
|
+
lang_single: false,
|
|
44
|
+
with_language_code: :none,
|
|
45
|
+
stage_format_long: false,
|
|
46
|
+
with_date: true,
|
|
47
|
+
annotated: false)
|
|
48
|
+
@stage_separator = stage_separator
|
|
49
|
+
@stage_separator_with_copublisher = stage_separator_with_copublisher
|
|
50
|
+
@type_separator = type_separator
|
|
51
|
+
@type_separator_with_prefix = type_separator_with_prefix
|
|
52
|
+
@default_type_abbr = default_type_abbr
|
|
53
|
+
@lang = lang
|
|
54
|
+
@lang_single = lang_single
|
|
55
|
+
@with_language_code = with_language_code
|
|
56
|
+
@stage_format_long = stage_format_long
|
|
57
|
+
@with_date = with_date
|
|
58
|
+
@annotated = annotated
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Get the appropriate stage separator based on whether there's a copublisher
|
|
62
|
+
#
|
|
63
|
+
# @param has_copublisher [Boolean] whether identifier has copublisher
|
|
64
|
+
# @return [String] the separator to use
|
|
65
|
+
def stage_separator_for(has_copublisher:)
|
|
66
|
+
has_copublisher ? @stage_separator_with_copublisher : @stage_separator
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Get the appropriate type separator based on whether there's a prefix
|
|
70
|
+
#
|
|
71
|
+
# @param has_prefix [Boolean] whether there's a prefix (stage or copublisher)
|
|
72
|
+
# @return [String] the separator to use
|
|
73
|
+
def type_separator_for(has_prefix:)
|
|
74
|
+
has_prefix ? @type_separator_with_prefix : @type_separator
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Check if type should be rendered (not default)
|
|
78
|
+
#
|
|
79
|
+
# @param type_abbr [String] type abbreviation to check
|
|
80
|
+
# @return [Boolean] true if type should be rendered
|
|
81
|
+
def should_render_type?(type_abbr)
|
|
82
|
+
type_abbr && type_abbr != @default_type_abbr
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# ISO rendering context singleton
|
|
86
|
+
# @return [RenderingContext] ISO-specific context
|
|
87
|
+
def self.iso
|
|
88
|
+
@iso ||= new(
|
|
89
|
+
stage_separator: "/",
|
|
90
|
+
stage_separator_with_copublisher: " ",
|
|
91
|
+
type_separator: "/",
|
|
92
|
+
type_separator_with_prefix: " ",
|
|
93
|
+
default_type_abbr: "IS",
|
|
94
|
+
)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# IEC rendering context singleton
|
|
98
|
+
# @return [RenderingContext] IEC-specific context
|
|
99
|
+
def self.iec
|
|
100
|
+
@iec ||= new(
|
|
101
|
+
stage_separator: "/",
|
|
102
|
+
stage_separator_with_copublisher: " ",
|
|
103
|
+
type_separator: "/",
|
|
104
|
+
type_separator_with_prefix: " ",
|
|
105
|
+
default_type_abbr: "IS",
|
|
106
|
+
)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# NIST rendering context singleton
|
|
110
|
+
# @return [RenderingContext] NIST-specific context
|
|
111
|
+
def self.nist
|
|
112
|
+
@nist ||= new(
|
|
113
|
+
stage_separator: "",
|
|
114
|
+
stage_separator_with_copublisher: " ",
|
|
115
|
+
type_separator: " ",
|
|
116
|
+
type_separator_with_prefix: " ",
|
|
117
|
+
default_type_abbr: "",
|
|
118
|
+
)
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# Format factory methods — replace RenderingStyle hierarchy
|
|
122
|
+
def self.ref_num_short
|
|
123
|
+
new(with_language_code: :single, stage_format_long: false,
|
|
124
|
+
with_date: true)
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def self.ref_num_long
|
|
128
|
+
new(with_language_code: :iso, stage_format_long: true, with_date: true)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def self.ref_dated
|
|
132
|
+
new(with_language_code: :none, stage_format_long: false,
|
|
133
|
+
with_date: true)
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def self.ref_undated
|
|
137
|
+
new(with_language_code: :none, stage_format_long: false,
|
|
138
|
+
with_date: false)
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def self.ref_undated_long
|
|
142
|
+
new(with_language_code: :none, stage_format_long: true,
|
|
143
|
+
with_date: false)
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def self.from_format(format)
|
|
147
|
+
case format
|
|
148
|
+
when :ref_num_short then ref_num_short
|
|
149
|
+
when :ref_num_long then ref_num_long
|
|
150
|
+
when :ref_dated then ref_dated
|
|
151
|
+
when :ref_dated_long then ref_dated
|
|
152
|
+
when :ref_undated then ref_undated
|
|
153
|
+
when :ref_undated_long then ref_undated_long
|
|
154
|
+
else ref_dated
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Rendering
|
|
5
|
+
module Date
|
|
6
|
+
# Render date with optional month/day
|
|
7
|
+
# @param date [Components::Date] date component
|
|
8
|
+
# @param options [Hash] rendering options
|
|
9
|
+
# @return [String] formatted date string
|
|
10
|
+
def render_date(date, **options)
|
|
11
|
+
return "" unless date&.year
|
|
12
|
+
|
|
13
|
+
result = ":#{date.year}"
|
|
14
|
+
|
|
15
|
+
if date.month && options[:include_month]
|
|
16
|
+
result += "-#{format('%02d', date.month)}"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
if date.day && options[:include_day]
|
|
20
|
+
result += "-#{format('%02d', date.day)}"
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
result
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Rendering
|
|
5
|
+
module Format
|
|
6
|
+
# Dispatch to appropriate format renderer
|
|
7
|
+
# @param format [Symbol] target format
|
|
8
|
+
# @return [String] formatted identifier string
|
|
9
|
+
def to_s(format = nil)
|
|
10
|
+
effective_format = determine_format(format)
|
|
11
|
+
send(:"to_#{effective_format}_style")
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
private
|
|
15
|
+
|
|
16
|
+
def determine_format(format)
|
|
17
|
+
return :short unless format
|
|
18
|
+
return :mr if format.to_sym == :mr
|
|
19
|
+
return :full if %i[full long].include?(format.to_sym)
|
|
20
|
+
|
|
21
|
+
:short
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Rendering
|
|
5
|
+
module Language
|
|
6
|
+
# Render language codes in parenthetical format
|
|
7
|
+
# @param languages [Array<Components::Language>] language components
|
|
8
|
+
# @param options [Hash] rendering options
|
|
9
|
+
# @return [String] formatted language string
|
|
10
|
+
def render_languages(languages, **options)
|
|
11
|
+
return "" unless languages&.any?
|
|
12
|
+
|
|
13
|
+
options[:lang_format] || :short
|
|
14
|
+
formatted = languages.map do |l|
|
|
15
|
+
l.to_s(lang_single: options[:lang_single])
|
|
16
|
+
end
|
|
17
|
+
"(#{formatted.join('/')})"
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Rendering
|
|
5
|
+
module Numbering
|
|
6
|
+
# Render number with optional parts and subparts
|
|
7
|
+
# @param number [Components::Code] primary number
|
|
8
|
+
# @param part [Components::Code, nil] optional part
|
|
9
|
+
# @param subpart [Components::Code, nil] optional subpart
|
|
10
|
+
# @param options [Hash] rendering options
|
|
11
|
+
# @return [String] formatted numbering string
|
|
12
|
+
def render_numbering(number, part = nil, subpart = nil, **options)
|
|
13
|
+
return "" unless number&.value
|
|
14
|
+
|
|
15
|
+
result = " #{number.value}"
|
|
16
|
+
separator = options[:part_separator] || "-"
|
|
17
|
+
result += "#{separator}#{part.value}" if part&.value
|
|
18
|
+
result += "#{separator}#{subpart.value}" if subpart&.value
|
|
19
|
+
|
|
20
|
+
result
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Rendering
|
|
5
|
+
module Publisher
|
|
6
|
+
# Render publisher with optional copublishers
|
|
7
|
+
# @param publisher [Components::Publisher, String] base publisher
|
|
8
|
+
# @param copublishers [Array<Components::Publisher>, nil] optional copublisher list
|
|
9
|
+
# @param options [Hash] rendering options
|
|
10
|
+
# @return [String] formatted publisher string
|
|
11
|
+
def render_publisher(publisher, copublishers = nil, **options)
|
|
12
|
+
return "" unless publisher
|
|
13
|
+
|
|
14
|
+
result = publisher.to_s
|
|
15
|
+
|
|
16
|
+
if copublishers&.any?
|
|
17
|
+
separator = options[:copublisher_separator] || "/"
|
|
18
|
+
result += copublishers.map { |cp| "#{separator}#{cp}" }.join
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
result
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Rendering
|
|
5
|
+
module Stage
|
|
6
|
+
# Render stage and type abbreviations
|
|
7
|
+
# @param stage [Components::Stage] stage component
|
|
8
|
+
# @param type [Components::Type] type component
|
|
9
|
+
# @param has_copublisher [Boolean] whether copublisher exists
|
|
10
|
+
# @param options [Hash] rendering options
|
|
11
|
+
# @return [String] formatted stage/type string
|
|
12
|
+
def render_stage(stage, type = nil, has_copublisher: false, **_options)
|
|
13
|
+
result = ""
|
|
14
|
+
|
|
15
|
+
if stage&.abbr
|
|
16
|
+
separator = has_copublisher ? " " : "/"
|
|
17
|
+
result += "#{separator}#{stage.abbr}"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
if type&.abbr && type.abbr != default_type_abbr
|
|
21
|
+
result += type_separator(has_copublisher, result) + type.abbr
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
result
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
private
|
|
28
|
+
|
|
29
|
+
def default_type_abbr
|
|
30
|
+
"IS" # Override in flavors
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def type_separator(has_copublisher, has_stage)
|
|
34
|
+
has_copublisher || has_stage.empty? ? " " : "/"
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Rendering
|
|
5
|
+
module Supplement
|
|
6
|
+
# Render supplement identifiers (amendment, corrigendum, addendum, etc.)
|
|
7
|
+
# @param base_identifier [Identifier] base identifier
|
|
8
|
+
# @param supplements [Array<Hash>] list of supplements
|
|
9
|
+
# @param options [Hash] rendering options
|
|
10
|
+
# @return [String] formatted supplement string
|
|
11
|
+
def render_supplements(base_identifier, supplements, **options)
|
|
12
|
+
return base_identifier.to_s(**options) unless supplements&.any?
|
|
13
|
+
|
|
14
|
+
result = base_identifier.to_s(**options)
|
|
15
|
+
|
|
16
|
+
supplements.each do |supp|
|
|
17
|
+
result += render_single_supplement(supp, **options)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
result
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
private
|
|
24
|
+
|
|
25
|
+
def render_single_supplement(supp, **options)
|
|
26
|
+
typed_stage = supp[:typed_stage]
|
|
27
|
+
number = supp[:number]
|
|
28
|
+
date = supp[:date]
|
|
29
|
+
|
|
30
|
+
sep = determine_separator(supp, options)
|
|
31
|
+
abbr = typed_stage.abbreviation(format_long: options[:stage_format_long])
|
|
32
|
+
|
|
33
|
+
result = "#{sep}#{abbr}"
|
|
34
|
+
result += " #{number}" if number
|
|
35
|
+
result += ":#{date.year}" if date&.year
|
|
36
|
+
|
|
37
|
+
result
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def determine_separator(supp, options)
|
|
41
|
+
supp_type = supp[:type]&.to_s
|
|
42
|
+
options[:"#{supp_type}_separator"] || options[:supplement_separator] || "/"
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Rendering
|
|
5
|
+
autoload :Base, "pubid/rendering/base"
|
|
6
|
+
autoload :Common, "pubid/rendering/common"
|
|
7
|
+
autoload :Date, "pubid/rendering/date"
|
|
8
|
+
autoload :Format, "pubid/rendering/format"
|
|
9
|
+
autoload :Language, "pubid/rendering/language"
|
|
10
|
+
autoload :Numbering, "pubid/rendering/numbering"
|
|
11
|
+
autoload :Publisher, "pubid/rendering/publisher"
|
|
12
|
+
autoload :Stage, "pubid/rendering/stage"
|
|
13
|
+
autoload :Supplement, "pubid/rendering/supplement"
|
|
14
|
+
autoload :RenderingContext, "pubid/rendering/context"
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Sae
|
|
5
|
+
class Builder < Pubid::Builder::Base
|
|
6
|
+
def self.build(parsed_data)
|
|
7
|
+
new.build(parsed_data)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
private
|
|
11
|
+
|
|
12
|
+
def default_identifier_class
|
|
13
|
+
Identifiers::Base
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def cast(type, value)
|
|
17
|
+
case type
|
|
18
|
+
when :publisher
|
|
19
|
+
"SAE"
|
|
20
|
+
when :type
|
|
21
|
+
Components::Type.new(abbr: value.to_s)
|
|
22
|
+
when :number
|
|
23
|
+
Components::Code.new(value: value.to_s)
|
|
24
|
+
when :year
|
|
25
|
+
{ date: Components::Date.new(year: value.to_i) }
|
|
26
|
+
else
|
|
27
|
+
value
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "lutaml/model"
|
|
4
|
+
|
|
5
|
+
module Pubid
|
|
6
|
+
module Sae
|
|
7
|
+
module Components
|
|
8
|
+
# Date component for SAE standards
|
|
9
|
+
# SAE uses year only (e.g., 2024, 2022)
|
|
10
|
+
class Date < Lutaml::Model::Serializable
|
|
11
|
+
attribute :year, :integer
|
|
12
|
+
|
|
13
|
+
def to_s
|
|
14
|
+
year.to_s
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "lutaml/model"
|
|
4
|
+
|
|
5
|
+
module Pubid
|
|
6
|
+
module Sae
|
|
7
|
+
module Components
|
|
8
|
+
# Type component for SAE document types
|
|
9
|
+
# AMS, AIR,, ARP, AS, MA
|
|
10
|
+
class Type < Lutaml::Model::Serializable
|
|
11
|
+
attribute :abbr, :string
|
|
12
|
+
|
|
13
|
+
def to_s
|
|
14
|
+
abbr.to_s
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|