relaton 2.2.0.pre.alpha.1 → 3.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/{docs/README.adoc → README.adoc} +165 -38
- data/bin/console +0 -1
- data/lib/relaton/3gpp/bibdata.rb +9 -0
- data/lib/relaton/3gpp/bibitem.rb +9 -0
- data/lib/relaton/3gpp/bibliography.rb +123 -0
- data/lib/relaton/3gpp/data_fetcher.rb +303 -0
- data/lib/relaton/3gpp/docidentifier.rb +114 -0
- data/lib/relaton/3gpp/doctype.rb +9 -0
- data/lib/relaton/3gpp/ext.rb +31 -0
- data/lib/relaton/3gpp/item.rb +18 -0
- data/lib/relaton/3gpp/item_data.rb +15 -0
- data/lib/relaton/3gpp/parser.rb +400 -0
- data/lib/relaton/3gpp/processor.rb +71 -0
- data/lib/relaton/3gpp/release.rb +34 -0
- data/lib/relaton/3gpp/util.rb +8 -0
- data/lib/relaton/3gpp.rb +29 -0
- data/lib/relaton/adobe/bibdata.rb +8 -0
- data/lib/relaton/adobe/bibitem.rb +8 -0
- data/lib/relaton/adobe/bibliography.rb +92 -0
- data/lib/relaton/adobe/docidentifier.rb +49 -0
- data/lib/relaton/adobe/doctype.rb +14 -0
- data/lib/relaton/adobe/ext.rb +32 -0
- data/lib/relaton/adobe/item.rb +15 -0
- data/lib/relaton/adobe/item_base.rb +18 -0
- data/lib/relaton/adobe/item_data.rb +6 -0
- data/lib/relaton/adobe/processor.rb +45 -0
- data/lib/relaton/adobe/util.rb +8 -0
- data/lib/relaton/adobe.rb +37 -0
- data/lib/relaton/bib/converter/asciibib/to_asciibib.rb +663 -0
- data/lib/relaton/bib/converter/asciibib.rb +13 -0
- data/lib/relaton/bib/converter/bibtex/from_bibtex.rb +245 -0
- data/lib/relaton/bib/converter/bibtex/to_bibtex.rb +341 -0
- data/lib/relaton/bib/converter/bibtex.rb +23 -0
- data/lib/relaton/bib/converter/bibxml/from_rfcxml.rb +386 -0
- data/lib/relaton/bib/converter/bibxml/from_rfcxml_referencegroup.rb +71 -0
- data/lib/relaton/bib/converter/bibxml/to_rfcxml.rb +308 -0
- data/lib/relaton/bib/converter/bibxml/to_rfcxml_referencegroup.rb +52 -0
- data/lib/relaton/bib/converter/bibxml.rb +51 -0
- data/lib/relaton/bib/hash_parser_v1.rb +767 -0
- data/lib/relaton/bib/item_data.rb +229 -0
- data/lib/relaton/bib/model/abstract.rb +16 -0
- data/lib/relaton/bib/model/address.rb +22 -0
- data/lib/relaton/bib/model/affiliation.rb +16 -0
- data/lib/relaton/bib/model/bibdata.rb +11 -0
- data/lib/relaton/bib/model/bibdata_shared.rb +12 -0
- data/lib/relaton/bib/model/bibitem.rb +11 -0
- data/lib/relaton/bib/model/bibitem_shared.rb +12 -0
- data/lib/relaton/bib/model/contact.rb +18 -0
- data/lib/relaton/bib/model/contribution_info.rb +15 -0
- data/lib/relaton/bib/model/contributor.rb +29 -0
- data/lib/relaton/bib/model/copyright.rb +27 -0
- data/lib/relaton/bib/model/date.rb +31 -0
- data/lib/relaton/bib/model/depiction.rb +16 -0
- data/lib/relaton/bib/model/docidentifier.rb +49 -0
- data/lib/relaton/bib/model/doctype.rb +14 -0
- data/lib/relaton/bib/model/edition.rb +14 -0
- data/lib/relaton/bib/model/ext.rb +39 -0
- data/lib/relaton/bib/model/extent.rb +16 -0
- data/lib/relaton/bib/model/formattedref.rb +43 -0
- data/lib/relaton/bib/model/full_name_type.rb +64 -0
- data/lib/relaton/bib/model/fullname.rb +11 -0
- data/lib/relaton/bib/model/ics.rb +49 -0
- data/lib/relaton/bib/model/image.rb +28 -0
- data/lib/relaton/bib/model/item.rb +96 -0
- data/lib/relaton/bib/model/item_base.rb +20 -0
- data/lib/relaton/bib/model/item_shared.rb +88 -0
- data/lib/relaton/bib/model/keyword.rb +30 -0
- data/lib/relaton/bib/model/locality.rb +18 -0
- data/lib/relaton/bib/model/locality_stack.rb +14 -0
- data/lib/relaton/bib/model/localized_string.rb +48 -0
- data/lib/relaton/bib/model/localized_string_attrs.rb +24 -0
- data/lib/relaton/bib/model/logo.rb +14 -0
- data/lib/relaton/bib/model/medium.rb +22 -0
- data/lib/relaton/bib/model/note.rb +16 -0
- data/lib/relaton/bib/model/organization.rb +13 -0
- data/lib/relaton/bib/model/organization_type.rb +42 -0
- data/lib/relaton/bib/model/person.rb +36 -0
- data/lib/relaton/bib/model/phone.rb +14 -0
- data/lib/relaton/bib/model/place.rb +33 -0
- data/lib/relaton/bib/model/price.rb +14 -0
- data/lib/relaton/bib/model/relation.rb +43 -0
- data/lib/relaton/bib/model/series.rb +34 -0
- data/lib/relaton/bib/model/size.rb +23 -0
- data/lib/relaton/bib/model/source_locality_stack.rb +14 -0
- data/lib/relaton/bib/model/status.rb +27 -0
- data/lib/relaton/bib/model/structured_identifier.rb +49 -0
- data/lib/relaton/bib/model/subdivision.rb +16 -0
- data/lib/relaton/bib/model/title.rb +56 -0
- data/lib/relaton/bib/model/type/plain_date.rb +16 -0
- data/lib/relaton/bib/model/type/string_date.rb +48 -0
- data/lib/relaton/bib/model/uri.rb +18 -0
- data/lib/relaton/bib/model/validity.rb +16 -0
- data/lib/relaton/bib/model/version.rb +43 -0
- data/lib/relaton/bib/namespace_helper.rb +21 -0
- data/lib/relaton/bib/sanitizer.rb +264 -0
- data/lib/relaton/bib/util.rb +18 -0
- data/lib/relaton/bib/versions.json +35 -0
- data/lib/relaton/bib.rb +46 -0
- data/lib/relaton/bipm/bibliography.rb +231 -0
- data/lib/relaton/bipm/converter/asciibib.rb +64 -0
- data/lib/relaton/bipm/data_fetcher.rb +81 -0
- data/lib/relaton/bipm/data_outcomes_parser.rb +656 -0
- data/lib/relaton/bipm/id_parser.rb +278 -0
- data/lib/relaton/bipm/item_data.rb +47 -0
- data/lib/relaton/bipm/model/bibdata.rb +9 -0
- data/lib/relaton/bipm/model/bibitem.rb +9 -0
- data/lib/relaton/bipm/model/comment_period.rb +13 -0
- data/lib/relaton/bipm/model/doctype.rb +12 -0
- data/lib/relaton/bipm/model/ext.rb +38 -0
- data/lib/relaton/bipm/model/item.rb +11 -0
- data/lib/relaton/bipm/model/structured_identifier.rb +36 -0
- data/lib/relaton/bipm/processor.rb +69 -0
- data/lib/relaton/bipm/rawdata_bipm_metrologia/affiliations.rb +111 -0
- data/lib/relaton/bipm/rawdata_bipm_metrologia/fetcher.rb +172 -0
- data/lib/relaton/bipm/rawdata_bipm_metrologia/niso_jats_parser.rb +353 -0
- data/lib/relaton/bipm/si_brochure_parser.rb +188 -0
- data/lib/relaton/bipm/util.rb +8 -0
- data/lib/relaton/bipm.rb +38 -0
- data/lib/relaton/bsi/bibliography.rb +196 -0
- data/lib/relaton/bsi/hit.rb +28 -0
- data/lib/relaton/bsi/hit_collection.rb +113 -0
- data/lib/relaton/bsi/item_data.rb +13 -0
- data/lib/relaton/bsi/model/bibdata.rb +8 -0
- data/lib/relaton/bsi/model/bibitem.rb +8 -0
- data/lib/relaton/bsi/model/docidentifier.rb +107 -0
- data/lib/relaton/bsi/model/doctype.rb +14 -0
- data/lib/relaton/bsi/model/ext.rb +17 -0
- data/lib/relaton/bsi/model/item.rb +17 -0
- data/lib/relaton/bsi/model/item_base.rb +22 -0
- data/lib/relaton/bsi/model/relation.rb +9 -0
- data/lib/relaton/bsi/processor.rb +43 -0
- data/lib/relaton/bsi/schema.json +24882 -0
- data/lib/relaton/bsi/scraper.rb +288 -0
- data/lib/relaton/bsi/util.rb +8 -0
- data/lib/relaton/bsi.rb +25 -0
- data/lib/relaton/calconnect/bibliography.rb +93 -0
- data/lib/relaton/calconnect/data_fetcher.rb +174 -0
- data/lib/relaton/calconnect/docidentifier.rb +80 -0
- data/lib/relaton/calconnect/hit.rb +14 -0
- data/lib/relaton/calconnect/hit_collection.rb +92 -0
- data/lib/relaton/calconnect/item_data.rb +12 -0
- data/lib/relaton/calconnect/model/bibdata.rb +8 -0
- data/lib/relaton/calconnect/model/bibitem.rb +8 -0
- data/lib/relaton/calconnect/model/doctype.rb +11 -0
- data/lib/relaton/calconnect/model/ext.rb +11 -0
- data/lib/relaton/calconnect/model/item.rb +20 -0
- data/lib/relaton/calconnect/processor.rb +72 -0
- data/lib/relaton/calconnect/scraper.rb +87 -0
- data/lib/relaton/calconnect/util.rb +8 -0
- data/lib/relaton/calconnect.rb +36 -0
- data/lib/relaton/ccsds/bibliography.rb +63 -0
- data/lib/relaton/ccsds/data/fetcher.rb +252 -0
- data/lib/relaton/ccsds/data/iso_references.rb +30 -0
- data/lib/relaton/ccsds/data/parser.rb +194 -0
- data/lib/relaton/ccsds/hit.rb +24 -0
- data/lib/relaton/ccsds/hit_collection.rb +47 -0
- data/lib/relaton/ccsds/item_data.rb +9 -0
- data/lib/relaton/ccsds/model/bibdata.rb +8 -0
- data/lib/relaton/ccsds/model/bibitem.rb +8 -0
- data/lib/relaton/ccsds/model/docidentifier.rb +121 -0
- data/lib/relaton/ccsds/model/doctype.rb +9 -0
- data/lib/relaton/ccsds/model/ext.rb +19 -0
- data/lib/relaton/ccsds/model/item.rb +15 -0
- data/lib/relaton/ccsds/processor.rb +68 -0
- data/lib/relaton/ccsds/util.rb +10 -0
- data/lib/relaton/ccsds.rb +33 -0
- data/lib/relaton/cen/bibliography.rb +149 -0
- data/lib/relaton/cen/committees.yaml +66 -0
- data/lib/relaton/cen/hit.rb +31 -0
- data/lib/relaton/cen/hit_collection.rb +116 -0
- data/lib/relaton/cen/item_data.rb +7 -0
- data/lib/relaton/cen/model/bibdata.rb +8 -0
- data/lib/relaton/cen/model/bibitem.rb +8 -0
- data/lib/relaton/cen/model/docidentifier.rb +100 -0
- data/lib/relaton/cen/model/ext.rb +11 -0
- data/lib/relaton/cen/model/item.rb +14 -0
- data/lib/relaton/cen/model/structured_identifier.rb +9 -0
- data/lib/relaton/cen/processor.rb +45 -0
- data/lib/relaton/cen/scraper.rb +218 -0
- data/lib/relaton/cen/util.rb +8 -0
- data/lib/relaton/cen.rb +30 -0
- data/lib/relaton/cie/bibdata.rb +8 -0
- data/lib/relaton/cie/bibitem.rb +8 -0
- data/lib/relaton/cie/bibliography.rb +31 -0
- data/lib/relaton/cie/data_fetcher.rb +540 -0
- data/lib/relaton/cie/ext.rb +7 -0
- data/lib/relaton/cie/item.rb +11 -0
- data/lib/relaton/cie/item_data.rb +6 -0
- data/lib/relaton/cie/processor.rb +68 -0
- data/lib/relaton/cie/scrapper.rb +52 -0
- data/lib/relaton/cie/util.rb +8 -0
- data/lib/relaton/cie.rb +29 -0
- data/lib/relaton/core/array_wrapper.rb +20 -0
- data/lib/relaton/core/data_fetcher.rb +244 -0
- data/lib/relaton/core/date_parser.rb +42 -0
- data/lib/relaton/core/governor.rb +320 -0
- data/lib/relaton/core/hash_keys_sybolizer.rb +19 -0
- data/lib/relaton/core/hit.rb +49 -0
- data/lib/relaton/core/hit_collection.rb +118 -0
- data/lib/relaton/core/pacer.rb +134 -0
- data/lib/relaton/core/processor.rb +67 -0
- data/lib/relaton/core/request_error.rb +14 -0
- data/lib/relaton/core/workers_pool.rb +45 -0
- data/lib/relaton/core.rb +12 -0
- data/lib/relaton/db/registry.rb +44 -4
- data/lib/relaton/db.rb +0 -1
- data/lib/relaton/doi/crossref.rb +89 -0
- data/lib/relaton/doi/parser.rb +921 -0
- data/lib/relaton/doi/processor.rb +65 -0
- data/lib/relaton/doi/util.rb +8 -0
- data/lib/relaton/doi.rb +20 -0
- data/lib/relaton/easc/bibdata.rb +8 -0
- data/lib/relaton/easc/bibitem.rb +8 -0
- data/lib/relaton/easc/bibliography.rb +95 -0
- data/lib/relaton/easc/docidentifier.rb +100 -0
- data/lib/relaton/easc/doctype.rb +14 -0
- data/lib/relaton/easc/ext.rb +44 -0
- data/lib/relaton/easc/item.rb +13 -0
- data/lib/relaton/easc/item_base.rb +18 -0
- data/lib/relaton/easc/item_data.rb +6 -0
- data/lib/relaton/easc/processor.rb +46 -0
- data/lib/relaton/easc/util.rb +8 -0
- data/lib/relaton/easc.rb +35 -0
- data/lib/relaton/ecma/bibdata.rb +8 -0
- data/lib/relaton/ecma/bibitem.rb +8 -0
- data/lib/relaton/ecma/bibliography.rb +149 -0
- data/lib/relaton/ecma/data_fetcher.rb +162 -0
- data/lib/relaton/ecma/data_parser.rb +49 -0
- data/lib/relaton/ecma/docidentifier.rb +124 -0
- data/lib/relaton/ecma/edition_parser.rb +80 -0
- data/lib/relaton/ecma/ext.rb +7 -0
- data/lib/relaton/ecma/item.rb +13 -0
- data/lib/relaton/ecma/item_data.rb +6 -0
- data/lib/relaton/ecma/memento_parser.rb +60 -0
- data/lib/relaton/ecma/page_fetcher.rb +39 -0
- data/lib/relaton/ecma/parser_common.rb +33 -0
- data/lib/relaton/ecma/processor.rb +69 -0
- data/lib/relaton/ecma/standard_parser.rb +134 -0
- data/lib/relaton/ecma/util.rb +8 -0
- data/lib/relaton/ecma.rb +33 -0
- data/lib/relaton/etsi/bibdata.rb +10 -0
- data/lib/relaton/etsi/bibitem.rb +10 -0
- data/lib/relaton/etsi/bibliography.rb +111 -0
- data/lib/relaton/etsi/data_fetcher.rb +167 -0
- data/lib/relaton/etsi/data_parser.rb +208 -0
- data/lib/relaton/etsi/doctype.rb +30 -0
- data/lib/relaton/etsi/ext.rb +31 -0
- data/lib/relaton/etsi/item.rb +15 -0
- data/lib/relaton/etsi/item_data.rb +6 -0
- data/lib/relaton/etsi/processor.rb +71 -0
- data/lib/relaton/etsi/pubid.rb +37 -0
- data/lib/relaton/etsi/status.rb +13 -0
- data/lib/relaton/etsi/util.rb +8 -0
- data/lib/relaton/etsi.rb +26 -0
- data/lib/relaton/gb/bibdata.rb +8 -0
- data/lib/relaton/gb/bibitem.rb +8 -0
- data/lib/relaton/gb/bibliography.rb +171 -0
- data/lib/relaton/gb/ccs.rb +14 -0
- data/lib/relaton/gb/committee.rb +13 -0
- data/lib/relaton/gb/docidentifier.rb +72 -0
- data/lib/relaton/gb/doctype.rb +9 -0
- data/lib/relaton/gb/ext.rb +36 -0
- data/lib/relaton/gb/gb_scraper.rb +61 -0
- data/lib/relaton/gb/gb_type.rb +20 -0
- data/lib/relaton/gb/hit.rb +48 -0
- data/lib/relaton/gb/hit_collection.rb +19 -0
- data/lib/relaton/gb/item.rb +13 -0
- data/lib/relaton/gb/item_data.rb +6 -0
- data/lib/relaton/gb/processor.rb +49 -0
- data/lib/relaton/gb/project_number.rb +38 -0
- data/lib/relaton/gb/scraper.rb +221 -0
- data/lib/relaton/gb/sec_scraper.rb +92 -0
- data/lib/relaton/gb/stage_name.rb +13 -0
- data/lib/relaton/gb/structured_identifier.rb +26 -0
- data/lib/relaton/gb/t_scraper.rb +126 -0
- data/lib/relaton/gb/util.rb +8 -0
- data/lib/relaton/gb/yaml/prefixes.yaml +200 -0
- data/lib/relaton/gb.rb +33 -0
- data/lib/relaton/gost/bibdata.rb +8 -0
- data/lib/relaton/gost/bibitem.rb +8 -0
- data/lib/relaton/gost/bibliography.rb +107 -0
- data/lib/relaton/gost/docidentifier.rb +80 -0
- data/lib/relaton/gost/doctype.rb +16 -0
- data/lib/relaton/gost/ext.rb +46 -0
- data/lib/relaton/gost/item.rb +15 -0
- data/lib/relaton/gost/item_base.rb +18 -0
- data/lib/relaton/gost/item_data.rb +6 -0
- data/lib/relaton/gost/processor.rb +49 -0
- data/lib/relaton/gost/util.rb +8 -0
- data/lib/relaton/gost.rb +36 -0
- data/lib/relaton/iala/bibdata.rb +8 -0
- data/lib/relaton/iala/bibitem.rb +8 -0
- data/lib/relaton/iala/bibliography.rb +146 -0
- data/lib/relaton/iala/docidentifier.rb +89 -0
- data/lib/relaton/iala/doctype.rb +18 -0
- data/lib/relaton/iala/ext.rb +32 -0
- data/lib/relaton/iala/item.rb +21 -0
- data/lib/relaton/iala/item_base.rb +18 -0
- data/lib/relaton/iala/item_data.rb +6 -0
- data/lib/relaton/iala/processor.rb +43 -0
- data/lib/relaton/iala/relation.rb +7 -0
- data/lib/relaton/iala/util.rb +8 -0
- data/lib/relaton/iala.rb +35 -0
- data/lib/relaton/iana/bibdata.rb +8 -0
- data/lib/relaton/iana/bibitem.rb +8 -0
- data/lib/relaton/iana/bibliography.rb +100 -0
- data/lib/relaton/iana/data_fetcher.rb +101 -0
- data/lib/relaton/iana/item.rb +7 -0
- data/lib/relaton/iana/item_data.rb +6 -0
- data/lib/relaton/iana/parser.rb +146 -0
- data/lib/relaton/iana/processor.rb +70 -0
- data/lib/relaton/iana/util.rb +8 -0
- data/lib/relaton/iana.rb +40 -0
- data/lib/relaton/iec/bibliography.rb +283 -0
- data/lib/relaton/iec/data_fetcher.rb +222 -0
- data/lib/relaton/iec/data_parser.rb +391 -0
- data/lib/relaton/iec/hit.rb +26 -0
- data/lib/relaton/iec/hit_collection.rb +138 -0
- data/lib/relaton/iec/item_data.rb +7 -0
- data/lib/relaton/iec/model/bibdata.rb +8 -0
- data/lib/relaton/iec/model/bibitem.rb +8 -0
- data/lib/relaton/iec/model/docidentifier.rb +135 -0
- data/lib/relaton/iec/model/doctype.rb +12 -0
- data/lib/relaton/iec/model/ext.rb +53 -0
- data/lib/relaton/iec/model/item.rb +20 -0
- data/lib/relaton/iec/model/item_base.rb +12 -0
- data/lib/relaton/iec/model/relation.rb +7 -0
- data/lib/relaton/iec/model/stage_name.rb +13 -0
- data/lib/relaton/iec/processor.rb +74 -0
- data/lib/relaton/iec/statuses.yml +199 -0
- data/lib/relaton/iec/util.rb +8 -0
- data/lib/relaton/iec.rb +98 -0
- data/lib/relaton/ieee/balloting_group.rb +13 -0
- data/lib/relaton/ieee/bibdata.rb +8 -0
- data/lib/relaton/ieee/bibitem.rb +8 -0
- data/lib/relaton/ieee/bibliography.rb +73 -0
- data/lib/relaton/ieee/converter/bibxml/from_rfcxml.rb +10 -0
- data/lib/relaton/ieee/converter/bibxml/from_rfcxml_referencegroup.rb +10 -0
- data/lib/relaton/ieee/converter/bibxml.rb +20 -0
- data/lib/relaton/ieee/data_fetcher.rb +771 -0
- data/lib/relaton/ieee/doctype.rb +9 -0
- data/lib/relaton/ieee/editorial_group.rb +19 -0
- data/lib/relaton/ieee/ext.rb +36 -0
- data/lib/relaton/ieee/idams_parser.rb +330 -0
- data/lib/relaton/ieee/item.rb +11 -0
- data/lib/relaton/ieee/item_data.rb +7 -0
- data/lib/relaton/ieee/processor.rb +71 -0
- data/lib/relaton/ieee/rawbib_id_parser.rb +753 -0
- data/lib/relaton/ieee/util.rb +8 -0
- data/lib/relaton/ieee.rb +30 -0
- data/lib/relaton/ietf/bibdata.rb +8 -0
- data/lib/relaton/ietf/bibitem.rb +8 -0
- data/lib/relaton/ietf/bibliography.rb +35 -0
- data/lib/relaton/ietf/bibxml_parser.rb +232 -0
- data/lib/relaton/ietf/data_fetcher.rb +561 -0
- data/lib/relaton/ietf/doctype.rb +9 -0
- data/lib/relaton/ietf/ext.rb +63 -0
- data/lib/relaton/ietf/item.rb +16 -0
- data/lib/relaton/ietf/item_base.rb +18 -0
- data/lib/relaton/ietf/item_data.rb +6 -0
- data/lib/relaton/ietf/processing_instructions.rb +79 -0
- data/lib/relaton/ietf/processor.rb +72 -0
- data/lib/relaton/ietf/relation.rb +9 -0
- data/lib/relaton/ietf/rfc/abstract.rb +19 -0
- data/lib/relaton/ietf/rfc/author.rb +21 -0
- data/lib/relaton/ietf/rfc/entry.rb +446 -0
- data/lib/relaton/ietf/rfc/entry_date.rb +21 -0
- data/lib/relaton/ietf/rfc/format.rb +19 -0
- data/lib/relaton/ietf/rfc/index.rb +46 -0
- data/lib/relaton/ietf/rfc/is_also.rb +21 -0
- data/lib/relaton/ietf/rfc/keywords.rb +19 -0
- data/lib/relaton/ietf/rfc/rfc_index_namespace.rb +11 -0
- data/lib/relaton/ietf/scraper.rb +101 -0
- data/lib/relaton/ietf/util.rb +8 -0
- data/lib/relaton/ietf/wg_name_resolver.rb +42 -0
- data/lib/relaton/ietf.rb +30 -0
- data/lib/relaton/iho/bibdata.rb +8 -0
- data/lib/relaton/iho/bibitem.rb +8 -0
- data/lib/relaton/iho/bibliography.rb +114 -0
- data/lib/relaton/iho/comment_period.rb +13 -0
- data/lib/relaton/iho/docidentifier.rb +31 -0
- data/lib/relaton/iho/doctype.rb +10 -0
- data/lib/relaton/iho/ext.rb +20 -0
- data/lib/relaton/iho/hash_parser_v1.rb +144 -0
- data/lib/relaton/iho/item.rb +20 -0
- data/lib/relaton/iho/item_base.rb +18 -0
- data/lib/relaton/iho/item_data.rb +6 -0
- data/lib/relaton/iho/processor.rb +54 -0
- data/lib/relaton/iho/relation.rb +9 -0
- data/lib/relaton/iho/structured_identifier.rb +20 -0
- data/lib/relaton/iho/util.rb +8 -0
- data/lib/relaton/iho.rb +27 -0
- data/lib/relaton/index/config.rb +52 -0
- data/lib/relaton/index/file_io.rb +305 -0
- data/lib/relaton/index/file_storage.rb +66 -0
- data/lib/relaton/index/pool.rb +46 -0
- data/lib/relaton/index/shard_source.rb +201 -0
- data/lib/relaton/index/type.rb +210 -0
- data/lib/relaton/index/util.rb +18 -0
- data/lib/relaton/index.rb +61 -0
- data/lib/relaton/isbn/isbn.rb +61 -0
- data/lib/relaton/isbn/open_library.rb +43 -0
- data/lib/relaton/isbn/parser.rb +88 -0
- data/lib/relaton/isbn/processor.rb +48 -0
- data/lib/relaton/isbn/util.rb +8 -0
- data/lib/relaton/isbn.rb +19 -0
- data/lib/relaton/iso/bibliography.rb +412 -0
- data/lib/relaton/iso/data_fetcher.rb +338 -0
- data/lib/relaton/iso/data_parser.rb +458 -0
- data/lib/relaton/iso/hash_parser_v1.rb +177 -0
- data/lib/relaton/iso/hit.rb +57 -0
- data/lib/relaton/iso/hit_collection.rb +196 -0
- data/lib/relaton/iso/item_data.rb +50 -0
- data/lib/relaton/iso/model/bibdata.rb +10 -0
- data/lib/relaton/iso/model/bibitem.rb +8 -0
- data/lib/relaton/iso/model/contributor.rb +6 -0
- data/lib/relaton/iso/model/contributor_info.rb +9 -0
- data/lib/relaton/iso/model/docidentifier.rb +146 -0
- data/lib/relaton/iso/model/doctype.rb +13 -0
- data/lib/relaton/iso/model/ext.rb +35 -0
- data/lib/relaton/iso/model/item.rb +17 -0
- data/lib/relaton/iso/model/item_base.rb +22 -0
- data/lib/relaton/iso/model/organization.rb +9 -0
- data/lib/relaton/iso/model/project_number.rb +22 -0
- data/lib/relaton/iso/model/relation.rb +9 -0
- data/lib/relaton/iso/model/stagename.rb +14 -0
- data/lib/relaton/iso/model/structured_identifier.rb +31 -0
- data/lib/relaton/iso/processor.rb +85 -0
- data/lib/relaton/iso/scraper.rb +635 -0
- data/lib/relaton/iso/type/pubid.rb +50 -0
- data/lib/relaton/iso/util.rb +8 -0
- data/lib/relaton/iso.rb +30 -0
- data/lib/relaton/itu/bibliography.rb +95 -0
- data/lib/relaton/itu/data_crawler_r.rb +664 -0
- data/lib/relaton/itu/data_fetcher.rb +550 -0
- data/lib/relaton/itu/data_merge_r.rb +149 -0
- data/lib/relaton/itu/data_parser_r.rb +214 -0
- data/lib/relaton/itu/data_parser_t.rb +228 -0
- data/lib/relaton/itu/family_cache.rb +177 -0
- data/lib/relaton/itu/governor.rb +56 -0
- data/lib/relaton/itu/hit.rb +28 -0
- data/lib/relaton/itu/hit_collection.rb +299 -0
- data/lib/relaton/itu/item_data.rb +6 -0
- data/lib/relaton/itu/model/approval_stage.rb +13 -0
- data/lib/relaton/itu/model/bibdata.rb +8 -0
- data/lib/relaton/itu/model/bibitem.rb +8 -0
- data/lib/relaton/itu/model/docidentifier.rb +75 -0
- data/lib/relaton/itu/model/doctype.rb +13 -0
- data/lib/relaton/itu/model/ext.rb +47 -0
- data/lib/relaton/itu/model/item.rb +13 -0
- data/lib/relaton/itu/model/meeting.rb +13 -0
- data/lib/relaton/itu/model/meeting_date.rb +15 -0
- data/lib/relaton/itu/model/question.rb +13 -0
- data/lib/relaton/itu/model/recommendation_status.rb +11 -0
- data/lib/relaton/itu/model/structured_identifier.rb +38 -0
- data/lib/relaton/itu/processor.rb +72 -0
- data/lib/relaton/itu/pubid.rb +199 -0
- data/lib/relaton/itu/radio_regulations_parser.rb +70 -0
- data/lib/relaton/itu/recommendation_fields.rb +334 -0
- data/lib/relaton/itu/recommendation_parser.rb +30 -0
- data/lib/relaton/itu/scraper.rb +203 -0
- data/lib/relaton/itu/util.rb +8 -0
- data/lib/relaton/itu.rb +34 -0
- data/lib/relaton/jcgm/bibdata.rb +8 -0
- data/lib/relaton/jcgm/bibitem.rb +8 -0
- data/lib/relaton/jcgm/bibliography.rb +97 -0
- data/lib/relaton/jcgm/data_fetcher.rb +81 -0
- data/lib/relaton/jcgm/docidentifier.rb +102 -0
- data/lib/relaton/jcgm/doctype.rb +12 -0
- data/lib/relaton/jcgm/ext.rb +23 -0
- data/lib/relaton/jcgm/item.rb +20 -0
- data/lib/relaton/jcgm/item_base.rb +18 -0
- data/lib/relaton/jcgm/item_data.rb +6 -0
- data/lib/relaton/jcgm/meetings_parser.rb +175 -0
- data/lib/relaton/jcgm/processor.rb +71 -0
- data/lib/relaton/jcgm/relation.rb +9 -0
- data/lib/relaton/jcgm/structured_identifier.rb +40 -0
- data/lib/relaton/jcgm/util.rb +8 -0
- data/lib/relaton/jcgm.rb +24 -0
- data/lib/relaton/jis/bibdata.rb +8 -0
- data/lib/relaton/jis/bibitem.rb +8 -0
- data/lib/relaton/jis/bibliography.rb +73 -0
- data/lib/relaton/jis/data_fetcher.rb +183 -0
- data/lib/relaton/jis/docidentifier.rb +120 -0
- data/lib/relaton/jis/doctype.rb +9 -0
- data/lib/relaton/jis/ext.rb +13 -0
- data/lib/relaton/jis/hit.rb +88 -0
- data/lib/relaton/jis/hit_collection.rb +128 -0
- data/lib/relaton/jis/item.rb +22 -0
- data/lib/relaton/jis/item_base.rb +26 -0
- data/lib/relaton/jis/item_data.rb +8 -0
- data/lib/relaton/jis/processor.rb +55 -0
- data/lib/relaton/jis/relation.rb +11 -0
- data/lib/relaton/jis/scraper.rb +232 -0
- data/lib/relaton/jis/structured_identifier.rb +13 -0
- data/lib/relaton/jis/util.rb +8 -0
- data/lib/relaton/jis.rb +32 -0
- data/lib/relaton/logger/channels/gh_issue.rb +143 -0
- data/lib/relaton/logger/config.rb +34 -0
- data/lib/relaton/logger/formatter_json.rb +8 -0
- data/lib/relaton/logger/formatter_string.rb +12 -0
- data/lib/relaton/logger/log.rb +64 -0
- data/lib/relaton/logger/log_device.rb +27 -0
- data/lib/relaton/logger/pool.rb +24 -0
- data/lib/relaton/logger.rb +18 -0
- data/lib/relaton/nist/bibdata.rb +8 -0
- data/lib/relaton/nist/bibitem.rb +8 -0
- data/lib/relaton/nist/bibliography.rb +191 -0
- data/lib/relaton/nist/comment_period.rb +15 -0
- data/lib/relaton/nist/data_fetcher.rb +134 -0
- data/lib/relaton/nist/date.rb +7 -0
- data/lib/relaton/nist/docidentifier.rb +165 -0
- data/lib/relaton/nist/doctype.rb +7 -0
- data/lib/relaton/nist/ext.rb +16 -0
- data/lib/relaton/nist/hit.rb +18 -0
- data/lib/relaton/nist/hit_collection.rb +362 -0
- data/lib/relaton/nist/item.rb +19 -0
- data/lib/relaton/nist/item_base.rb +16 -0
- data/lib/relaton/nist/item_data.rb +6 -0
- data/lib/relaton/nist/mods_parser.rb +302 -0
- data/lib/relaton/nist/processor.rb +69 -0
- data/lib/relaton/nist/pubs_export.rb +69 -0
- data/lib/relaton/nist/relation.rb +10 -0
- data/lib/relaton/nist/scraper.rb +293 -0
- data/lib/relaton/nist/series.yaml +49 -0
- data/lib/relaton/nist/util.rb +8 -0
- data/lib/relaton/nist.rb +34 -0
- data/lib/relaton/oasis/bibdata.rb +8 -0
- data/lib/relaton/oasis/bibitem.rb +8 -0
- data/lib/relaton/oasis/bibliography.rb +201 -0
- data/lib/relaton/oasis/browser_agent.rb +71 -0
- data/lib/relaton/oasis/data_fetcher.rb +130 -0
- data/lib/relaton/oasis/data_parser.rb +305 -0
- data/lib/relaton/oasis/data_parser_utils.rb +330 -0
- data/lib/relaton/oasis/data_part_parser.rb +239 -0
- data/lib/relaton/oasis/docidentifier.rb +54 -0
- data/lib/relaton/oasis/doctype.rb +7 -0
- data/lib/relaton/oasis/ext.rb +19 -0
- data/lib/relaton/oasis/item.rb +14 -0
- data/lib/relaton/oasis/item_data.rb +6 -0
- data/lib/relaton/oasis/processor.rb +74 -0
- data/lib/relaton/oasis/util.rb +8 -0
- data/lib/relaton/oasis.rb +41 -0
- data/lib/relaton/ogc/bibdata.rb +8 -0
- data/lib/relaton/ogc/bibitem.rb +8 -0
- data/lib/relaton/ogc/bibliography.rb +64 -0
- data/lib/relaton/ogc/data_fetcher.rb +131 -0
- data/lib/relaton/ogc/docidentifier.rb +111 -0
- data/lib/relaton/ogc/doctype.rb +12 -0
- data/lib/relaton/ogc/ext.rb +15 -0
- data/lib/relaton/ogc/hit.rb +18 -0
- data/lib/relaton/ogc/hit_collection.rb +111 -0
- data/lib/relaton/ogc/item.rb +13 -0
- data/lib/relaton/ogc/item_data.rb +6 -0
- data/lib/relaton/ogc/processor.rb +59 -0
- data/lib/relaton/ogc/scraper.rb +225 -0
- data/lib/relaton/ogc/util.rb +8 -0
- data/lib/relaton/ogc.rb +30 -0
- data/lib/relaton/oiml/bibdata.rb +8 -0
- data/lib/relaton/oiml/bibitem.rb +8 -0
- data/lib/relaton/oiml/bibliography.rb +169 -0
- data/lib/relaton/oiml/docidentifier.rb +48 -0
- data/lib/relaton/oiml/doctype.rb +13 -0
- data/lib/relaton/oiml/ext.rb +42 -0
- data/lib/relaton/oiml/item.rb +20 -0
- data/lib/relaton/oiml/item_base.rb +18 -0
- data/lib/relaton/oiml/item_data.rb +6 -0
- data/lib/relaton/oiml/processor.rb +54 -0
- data/lib/relaton/oiml/relation.rb +9 -0
- data/lib/relaton/oiml/util.rb +8 -0
- data/lib/relaton/oiml.rb +24 -0
- data/lib/relaton/omg/bibdata.rb +8 -0
- data/lib/relaton/omg/bibitem.rb +8 -0
- data/lib/relaton/omg/bibliography.rb +31 -0
- data/lib/relaton/omg/docidentifier.rb +67 -0
- data/lib/relaton/omg/ext.rb +7 -0
- data/lib/relaton/omg/item.rb +9 -0
- data/lib/relaton/omg/item_data.rb +6 -0
- data/lib/relaton/omg/processor.rb +35 -0
- data/lib/relaton/omg/scraper.rb +186 -0
- data/lib/relaton/omg/util.rb +8 -0
- data/lib/relaton/omg.rb +25 -0
- data/lib/relaton/plateau/bibdata.rb +8 -0
- data/lib/relaton/plateau/bibitem.rb +8 -0
- data/lib/relaton/plateau/bibliography.rb +31 -0
- data/lib/relaton/plateau/data_fetcher.rb +176 -0
- data/lib/relaton/plateau/doctype.rb +7 -0
- data/lib/relaton/plateau/ext.rb +23 -0
- data/lib/relaton/plateau/handbook_parser.rb +102 -0
- data/lib/relaton/plateau/hit.rb +21 -0
- data/lib/relaton/plateau/hit_collection.rb +79 -0
- data/lib/relaton/plateau/item.rb +12 -0
- data/lib/relaton/plateau/item_data.rb +6 -0
- data/lib/relaton/plateau/parser.rb +101 -0
- data/lib/relaton/plateau/processor.rb +51 -0
- data/lib/relaton/plateau/technical_report_parser.rb +98 -0
- data/lib/relaton/plateau/util.rb +8 -0
- data/lib/relaton/plateau.rb +29 -0
- data/lib/relaton/sdo/config.rb +34 -0
- data/lib/relaton/sdo/fetcher.rb +52 -0
- data/lib/relaton/sdo/logo.rb +95 -0
- data/lib/relaton/sdo/name.rb +26 -0
- data/lib/relaton/sdo/organization.rb +71 -0
- data/lib/relaton/sdo/store.rb +49 -0
- data/lib/relaton/sdo.rb +29 -0
- data/lib/relaton/un/bibdata.rb +8 -0
- data/lib/relaton/un/bibitem.rb +8 -0
- data/lib/relaton/un/bibliography.rb +48 -0
- data/lib/relaton/un/doctype.rb +10 -0
- data/lib/relaton/un/ext.rb +30 -0
- data/lib/relaton/un/hit.rb +56 -0
- data/lib/relaton/un/hit_collection.rb +61 -0
- data/lib/relaton/un/item.rb +11 -0
- data/lib/relaton/un/item_data.rb +6 -0
- data/lib/relaton/un/parser.rb +108 -0
- data/lib/relaton/un/processor.rb +38 -0
- data/lib/relaton/un/session.rb +25 -0
- data/lib/relaton/un/token_generator.rb +105 -0
- data/lib/relaton/un/util.rb +8 -0
- data/lib/relaton/un/wasm/decoder.rb +434 -0
- data/lib/relaton/un/wasm/instance.rb +101 -0
- data/lib/relaton/un/wasm/interpreter.rb +613 -0
- data/lib/relaton/un/wasm/memory.rb +112 -0
- data/lib/relaton/un/wasm/module.rb +47 -0
- data/lib/relaton/un/wasm.rb +17 -0
- data/lib/relaton/un/wasm_v_bg.wasm +0 -0
- data/lib/relaton/un.rb +28 -0
- data/lib/relaton/version.rb +1 -1
- data/lib/relaton/w3c/bibdata.rb +8 -0
- data/lib/relaton/w3c/bibitem.rb +8 -0
- data/lib/relaton/w3c/bibliography.rb +174 -0
- data/lib/relaton/w3c/data_fetcher.rb +487 -0
- data/lib/relaton/w3c/data_parser.rb +379 -0
- data/lib/relaton/w3c/docidentifier.rb +48 -0
- data/lib/relaton/w3c/doctype.rb +7 -0
- data/lib/relaton/w3c/ext.rb +11 -0
- data/lib/relaton/w3c/governor.rb +32 -0
- data/lib/relaton/w3c/item.rb +15 -0
- data/lib/relaton/w3c/item_data.rb +6 -0
- data/lib/relaton/w3c/processor.rb +49 -0
- data/lib/relaton/w3c/pubid.rb +85 -0
- data/lib/relaton/w3c/safe_realize.rb +148 -0
- data/lib/relaton/w3c/util.rb +8 -0
- data/lib/relaton/w3c.rb +36 -0
- data/lib/relaton/xsf/bibdata.rb +8 -0
- data/lib/relaton/xsf/bibitem.rb +8 -0
- data/lib/relaton/xsf/bibliography.rb +84 -0
- data/lib/relaton/xsf/data_fetcher.rb +106 -0
- data/lib/relaton/xsf/docidentifier.rb +46 -0
- data/lib/relaton/xsf/hit.rb +17 -0
- data/lib/relaton/xsf/hit_collection.rb +52 -0
- data/lib/relaton/xsf/item.rb +13 -0
- data/lib/relaton/xsf/item_data.rb +6 -0
- data/lib/relaton/xsf/processor.rb +51 -0
- data/lib/relaton/xsf/util.rb +9 -0
- data/lib/relaton/xsf.rb +34 -0
- data/lib/relaton-core.rb +1 -0
- data/lib/relaton.rb +85 -0
- metadata +775 -161
- data/.github/workflows/rake.yml +0 -14
- data/.github/workflows/release.yml +0 -24
- data/.github/workflows/rubocop.yml +0 -48
- data/.gitignore +0 -12
- data/.rspec +0 -3
- data/CLAUDE.md +0 -78
- data/Gemfile +0 -29
- data/Rakefile +0 -6
- data/docs/CHANGELOG.adoc +0 -16
- data/docs/VERSIONING_POLICY.adoc +0 -38
- data/docs/navigation.adoc +0 -6
- data/lib/relaton/db/version.rb +0 -5
- data/relaton.gemspec +0 -72
- data/spec/relaton/config_spec.rb +0 -10
- data/spec/relaton/db_cache_spec.rb +0 -51
- data/spec/relaton/db_spec.rb +0 -567
- data/spec/relaton/registry_spec.rb +0 -178
- data/spec/relaton/util_spec.rb +0 -3
- data/spec/relaton_meta_spec.rb +0 -25
- data/spec/relaton_spec.rb +0 -800
- data/spec/spec_helper.rb +0 -45
- data/spec/support/gb_t_20223_2006.xml +0 -33
- data/spec/support/iso_111111119115_1.xml +0 -0
- data/spec/support/iso_19115_1.xml +0 -115
- data/spec/support/iso_19115_2.xml +0 -95
- data/spec/support/rfc_8341.xml +0 -46
- data/spec/vcr_cassetes/api_relaton_org.yml +0 -121
- data/spec/vcr_cassetes/api_relaton_org_unavailable.yml +0 -140
- data/spec/vcr_cassetes/cc_dir_10005_2019.yml +0 -202
- data/spec/vcr_cassetes/cipm_meeting_43.yml +0 -1505
- data/spec/vcr_cassetes/gb_t_20223_2006.yml +0 -729
- data/spec/vcr_cassetes/iso_111111119115_1.yml +0 -12951
- data/spec/vcr_cassetes/iso_19115_1.yml +0 -17334
- data/spec/vcr_cassetes/iso_19115_1_2.yml +0 -322
- data/spec/vcr_cassetes/iso_19115_1_std.yml +0 -17334
- data/spec/vcr_cassetes/iso_19115_all_parts.yml +0 -185
- data/spec/vcr_cassetes/iso_19133_2005.yml +0 -144
- data/spec/vcr_cassetes/iso_combined_applied.yml +0 -318
- data/spec/vcr_cassetes/iso_combined_included.yml +0 -318
- data/spec/vcr_cassetes/ogc_19_025r1.yml +0 -374
- data/spec/vcr_cassetes/omg_ami4ccm_1_0.yml +0 -317
- data/spec/vcr_cassetes/rfc_8341.yml +0 -1278
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
require "nokogiri"
|
|
2
|
+
|
|
3
|
+
module Relaton
|
|
4
|
+
module Bib
|
|
5
|
+
# Strips inline markup not in the basicdoc PureTextElement set
|
|
6
|
+
# (plus <p>, <eref>, <xref>, <fn>, <link>) from raw marked-up content
|
|
7
|
+
# strings. Disallowed elements are unwrapped: tags removed, inner text kept.
|
|
8
|
+
#
|
|
9
|
+
# <link> (basicdoc's inline hyperlink) is admitted because it is a valid
|
|
10
|
+
# TextElement child of a biblionote and carries a target URL that must
|
|
11
|
+
# survive the from_xml/to_xml round-trip — dropping it silently loses
|
|
12
|
+
# every URL in amended note.display references (relaton-bib#122).
|
|
13
|
+
#
|
|
14
|
+
# <fn> is admitted beyond strict PureTextElement because bibliographic
|
|
15
|
+
# titles in real Metanorma input routinely carry footnotes (e.g. ISO
|
|
16
|
+
# standards titles with a disclaimer footnote), and downstream
|
|
17
|
+
# consumers — notably relaton-render's own inline-tag allow-list —
|
|
18
|
+
# already accept <fn> as a legitimate child of <title>. Stripping it
|
|
19
|
+
# here would break the round-trip.
|
|
20
|
+
#
|
|
21
|
+
# OPAQUE elements (currently <stem>) are also allowed, but the
|
|
22
|
+
# sanitiser does not descend into them: their contents are out-of-band
|
|
23
|
+
# inline notation (MathML, AsciiMath, LaTeX) rather than basicdoc
|
|
24
|
+
# markup, and must be preserved verbatim. Without the opaque-skip,
|
|
25
|
+
# the recursive walk would unwrap MathML / AsciiMath elements down to
|
|
26
|
+
# bare text nodes — see #116 for the round-trip-loss symptom.
|
|
27
|
+
module Sanitizer
|
|
28
|
+
ALLOWED = %w[
|
|
29
|
+
em strong sub sup tt underline strike smallcap br stem
|
|
30
|
+
p eref xref fn link
|
|
31
|
+
].freeze
|
|
32
|
+
|
|
33
|
+
# Elements whose children are non-basicdoc inline notation
|
|
34
|
+
# (MathML, AsciiMath, LaTeX, …) and must be preserved verbatim
|
|
35
|
+
# rather than sanitised against ALLOWED.
|
|
36
|
+
OPAQUE = %w[stem].freeze
|
|
37
|
+
|
|
38
|
+
RENAME = {
|
|
39
|
+
"italic" => "em",
|
|
40
|
+
}.freeze
|
|
41
|
+
|
|
42
|
+
TAG_RX = %r{<[a-zA-Z/!?]}
|
|
43
|
+
|
|
44
|
+
# Captures a namespace prefix, on a tag or on an attribute: the
|
|
45
|
+
# "jats" of <jats:p> and </jats:italic>, and the "xlink" of
|
|
46
|
+
# xlink:href.
|
|
47
|
+
NS_PREFIX_RX = %r{(?:</?|\s)([A-Za-z_][\w.-]*):(?=[A-Za-z_])}
|
|
48
|
+
|
|
49
|
+
# Namespace that declares a prefix which the content leaves
|
|
50
|
+
# undeclared. The sanitiser removes it again before it serialises.
|
|
51
|
+
NS_PLACEHOLDER = "urn:x-relaton-undeclared:%s".freeze
|
|
52
|
+
|
|
53
|
+
# Element that carries the placeholder declarations. Its children
|
|
54
|
+
# are the sanitised content, so the element itself never reaches
|
|
55
|
+
# the output.
|
|
56
|
+
NS_WRAPPER = "relaton-sanitizer-root".freeze
|
|
57
|
+
|
|
58
|
+
# Extension that lengthens the wrapper name past a collision, and
|
|
59
|
+
# the pattern that measures how far the content already extends it.
|
|
60
|
+
NS_WRAPPER_SUFFIX = "-x".freeze
|
|
61
|
+
NS_WRAPPER_RX = /#{NS_WRAPPER}(?:#{NS_WRAPPER_SUFFIX})*/
|
|
62
|
+
|
|
63
|
+
# Reserved prefixes. XML declares both, so the content must not.
|
|
64
|
+
NS_RESERVED = %w[xml xmlns].freeze
|
|
65
|
+
|
|
66
|
+
# Serialise without the FORMAT option, so the sanitiser keeps the
|
|
67
|
+
# shape of element-only content instead of adding newlines and
|
|
68
|
+
# indent.
|
|
69
|
+
SAVE_OPTS = Nokogiri::XML::Node::SaveOptions::AS_XML
|
|
70
|
+
|
|
71
|
+
def self.sanitize(content)
|
|
72
|
+
return content unless sanitizable?(content)
|
|
73
|
+
|
|
74
|
+
node = parse(content)
|
|
75
|
+
return content if node.nil?
|
|
76
|
+
|
|
77
|
+
sanitize_children(node)
|
|
78
|
+
node.children.map do |c|
|
|
79
|
+
c.to_xml(encoding: "UTF-8", save_with: SAVE_OPTS)
|
|
80
|
+
end.join
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
#
|
|
84
|
+
# Parse the content into a node whose children are the content.
|
|
85
|
+
#
|
|
86
|
+
# @param [String] content The raw marked-up content.
|
|
87
|
+
#
|
|
88
|
+
# @return [Nokogiri::XML::Node, nil] The node, or nil when the
|
|
89
|
+
# content does not parse.
|
|
90
|
+
#
|
|
91
|
+
def self.parse(content)
|
|
92
|
+
fragment = Nokogiri::XML::DocumentFragment.parse(content)
|
|
93
|
+
return fragment if fragment.errors.empty?
|
|
94
|
+
|
|
95
|
+
parse_with_prefixes(content)
|
|
96
|
+
end
|
|
97
|
+
private_class_method :parse
|
|
98
|
+
|
|
99
|
+
#
|
|
100
|
+
# Parse content that uses undeclared namespace prefixes.
|
|
101
|
+
#
|
|
102
|
+
# An undeclared prefix is always a parse error, so without this the
|
|
103
|
+
# sanitiser gives up on exactly the third-party markup that needs
|
|
104
|
+
# sanitising most. Declare every prefix that the content uses on a
|
|
105
|
+
# wrapper element, parse, then remove the placeholder namespaces
|
|
106
|
+
# from the elements and from the attributes. See metanorma-pdfa#99.
|
|
107
|
+
#
|
|
108
|
+
# An undeclared prefix inside an OPAQUE <stem> goes as well. The
|
|
109
|
+
# sanitiser cannot keep it: an undeclared prefix in the output is
|
|
110
|
+
# the exact failure that this method removes. Only a namespace that
|
|
111
|
+
# the content declares itself survives verbatim.
|
|
112
|
+
#
|
|
113
|
+
# @param [String] content The raw marked-up content.
|
|
114
|
+
#
|
|
115
|
+
# @return [Nokogiri::XML::Element, nil] The wrapper element, or nil
|
|
116
|
+
# when the content uses no prefix or does not parse.
|
|
117
|
+
#
|
|
118
|
+
def self.parse_with_prefixes(content)
|
|
119
|
+
decl = placeholder_declarations(content) or return
|
|
120
|
+
name = wrapper_name(content)
|
|
121
|
+
doc = Nokogiri::XML "<#{name} #{decl}>#{content}</#{name}>"
|
|
122
|
+
return unless doc.errors.empty?
|
|
123
|
+
|
|
124
|
+
drop_placeholder_namespaces doc.root
|
|
125
|
+
end
|
|
126
|
+
private_class_method :parse_with_prefixes
|
|
127
|
+
|
|
128
|
+
#
|
|
129
|
+
# Declare every namespace prefix that the content uses.
|
|
130
|
+
#
|
|
131
|
+
# @param [String] content The raw marked-up content.
|
|
132
|
+
#
|
|
133
|
+
# @return [String, nil] The declarations, or nil when the content
|
|
134
|
+
# uses no prefix.
|
|
135
|
+
#
|
|
136
|
+
def self.placeholder_declarations(content)
|
|
137
|
+
prefixes = content.scan(NS_PREFIX_RX).flatten.uniq - NS_RESERVED
|
|
138
|
+
return if prefixes.empty?
|
|
139
|
+
|
|
140
|
+
prefixes.map do |pfx|
|
|
141
|
+
%(xmlns:#{pfx}="#{format NS_PLACEHOLDER, pfx}")
|
|
142
|
+
end.join(" ")
|
|
143
|
+
end
|
|
144
|
+
private_class_method :placeholder_declarations
|
|
145
|
+
|
|
146
|
+
#
|
|
147
|
+
# Name a wrapper element that the content does not close itself.
|
|
148
|
+
#
|
|
149
|
+
# Content that holds the literal end tag of the wrapper would close
|
|
150
|
+
# it early. The document then has more than one root, the parse
|
|
151
|
+
# fails, and the sanitiser gives up on content that it can handle.
|
|
152
|
+
#
|
|
153
|
+
# Extend past the longest run of the suffix that the content already
|
|
154
|
+
# holds, in ONE scan. Growing the name and re-testing with include?
|
|
155
|
+
# is quadratic: each extension re-scans the whole string, and
|
|
156
|
+
# content shaped like "…-root-x-x-x" forces one pass per two
|
|
157
|
+
# characters (measured at 229 ms for 20k characters). The sanitiser
|
|
158
|
+
# runs on every marked-up assignment, on third-party content.
|
|
159
|
+
#
|
|
160
|
+
# @param [String] content The raw marked-up content.
|
|
161
|
+
#
|
|
162
|
+
# @return [String] A name that the content does not contain.
|
|
163
|
+
#
|
|
164
|
+
def self.wrapper_name(content)
|
|
165
|
+
longest = content.scan(NS_WRAPPER_RX).map(&:size).max
|
|
166
|
+
return NS_WRAPPER unless longest
|
|
167
|
+
|
|
168
|
+
extra = ((longest - NS_WRAPPER.size) / NS_WRAPPER_SUFFIX.size) + 1
|
|
169
|
+
NS_WRAPPER + (NS_WRAPPER_SUFFIX * extra)
|
|
170
|
+
end
|
|
171
|
+
private_class_method :wrapper_name
|
|
172
|
+
|
|
173
|
+
#
|
|
174
|
+
# Remove the placeholder namespaces, and only those.
|
|
175
|
+
#
|
|
176
|
+
# Nokogiri's remove_namespaces! would also strip a namespace that
|
|
177
|
+
# the content declares itself, such as the MathML xmlns inside an
|
|
178
|
+
# OPAQUE <stem>, which must survive verbatim. Match the wrapper's
|
|
179
|
+
# own declarations, so a namespace of the content never matches,
|
|
180
|
+
# whatever its URI.
|
|
181
|
+
#
|
|
182
|
+
# The declarations stay on the wrapper element. Only its children
|
|
183
|
+
# reach the output, so the declarations never leak. Do not
|
|
184
|
+
# serialise the root itself.
|
|
185
|
+
#
|
|
186
|
+
# @param [Nokogiri::XML::Element] root The wrapper element.
|
|
187
|
+
#
|
|
188
|
+
# @return [Nokogiri::XML::Element] The same element.
|
|
189
|
+
#
|
|
190
|
+
def self.drop_placeholder_namespaces(root)
|
|
191
|
+
placeholders = root.namespace_definitions
|
|
192
|
+
root.traverse do |node|
|
|
193
|
+
node.namespace = nil if placeholders.include?(node.namespace)
|
|
194
|
+
next unless node.element?
|
|
195
|
+
|
|
196
|
+
drop_attribute_namespaces node, placeholders
|
|
197
|
+
end
|
|
198
|
+
root
|
|
199
|
+
end
|
|
200
|
+
private_class_method :drop_placeholder_namespaces
|
|
201
|
+
|
|
202
|
+
#
|
|
203
|
+
# Un-prefix the placeholder attributes of one element.
|
|
204
|
+
#
|
|
205
|
+
# Un-prefixing renames the attribute, so it can collide: an element
|
|
206
|
+
# carrying both target and xlink:target would keep two attributes
|
|
207
|
+
# called target, and Nokogiri rejects the result with "Attribute
|
|
208
|
+
# target redefined" -- the unparseable output this whole path
|
|
209
|
+
# exists to prevent. Drop the prefixed one instead.
|
|
210
|
+
#
|
|
211
|
+
# @param [Nokogiri::XML::Element] node The element.
|
|
212
|
+
# @param [Array<Nokogiri::XML::Namespace>] placeholders The
|
|
213
|
+
# wrapper's own declarations.
|
|
214
|
+
#
|
|
215
|
+
# @return [void]
|
|
216
|
+
#
|
|
217
|
+
def self.drop_attribute_namespaces(node, placeholders)
|
|
218
|
+
node.attribute_nodes.each do |attr|
|
|
219
|
+
next unless placeholders.include?(attr.namespace)
|
|
220
|
+
|
|
221
|
+
if plain_attribute?(node, attr.name) then attr.unlink
|
|
222
|
+
else attr.namespace = nil
|
|
223
|
+
end
|
|
224
|
+
end
|
|
225
|
+
end
|
|
226
|
+
private_class_method :drop_attribute_namespaces
|
|
227
|
+
|
|
228
|
+
#
|
|
229
|
+
# Does the element already carry this attribute without a prefix?
|
|
230
|
+
#
|
|
231
|
+
# Nokogiri's Node#attribute matches on the name alone, so it finds
|
|
232
|
+
# the prefixed attribute itself and every un-prefixing would look
|
|
233
|
+
# like a collision. Match on the namespace as well.
|
|
234
|
+
#
|
|
235
|
+
# @param [Nokogiri::XML::Element] node The element.
|
|
236
|
+
# @param [String] name The un-prefixed attribute name.
|
|
237
|
+
#
|
|
238
|
+
# @return [Boolean] Whether the element carries it.
|
|
239
|
+
#
|
|
240
|
+
def self.plain_attribute?(node, name)
|
|
241
|
+
node.attribute_nodes.any? { |a| a.namespace.nil? && a.name == name }
|
|
242
|
+
end
|
|
243
|
+
private_class_method :plain_attribute?
|
|
244
|
+
|
|
245
|
+
def self.sanitizable?(content)
|
|
246
|
+
content.is_a?(::String) && !content.empty? && content.match?(TAG_RX)
|
|
247
|
+
end
|
|
248
|
+
private_class_method :sanitizable?
|
|
249
|
+
|
|
250
|
+
def self.sanitize_children(node)
|
|
251
|
+
node.children.to_a.each do |child|
|
|
252
|
+
next unless child.element?
|
|
253
|
+
|
|
254
|
+
child.name = RENAME[child.name] if RENAME.key?(child.name)
|
|
255
|
+
next if OPAQUE.include?(child.name)
|
|
256
|
+
|
|
257
|
+
sanitize_children(child)
|
|
258
|
+
child.replace(child.children) unless ALLOWED.include?(child.name)
|
|
259
|
+
end
|
|
260
|
+
end
|
|
261
|
+
private_class_method :sanitize_children
|
|
262
|
+
end
|
|
263
|
+
end
|
|
264
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module Relaton
|
|
2
|
+
module Bib
|
|
3
|
+
module Util
|
|
4
|
+
extend self
|
|
5
|
+
|
|
6
|
+
PROGNAME = "relaton-bib".freeze
|
|
7
|
+
|
|
8
|
+
def method_missing(method_name, msg = nil, prog = nil, **opts, &block)
|
|
9
|
+
prog ||= self::PROGNAME
|
|
10
|
+
Relaton.logger_pool.send method_name, msg, prog, **opts, &block
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def respond_to_missing?(method_name, include_private = false)
|
|
14
|
+
Relaton.logger_pool.respond_to?(method_name) || super
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"relaton-models": "v1.5.6",
|
|
3
|
+
"basicdoc-models": "v1.2.5",
|
|
4
|
+
"metanorma-requirements-models": "v1.0.2",
|
|
5
|
+
"relaton-model-ieee": "v1.1.3",
|
|
6
|
+
"relaton-model-iso": "v1.1.2",
|
|
7
|
+
"relaton-model-iec": "v1.1.2",
|
|
8
|
+
"relaton-model-bsi": "v1.1.3",
|
|
9
|
+
"relaton-model-gb": "v1.1.2",
|
|
10
|
+
"relaton-model-mpfa": "v1.0.0",
|
|
11
|
+
"relaton-model-bipm": "v1.1.2",
|
|
12
|
+
"relaton-model-w3c": "v1.0.0",
|
|
13
|
+
"relaton-model-3gpp": "v1.0.4",
|
|
14
|
+
"relaton-model-cc": "v1.1.2",
|
|
15
|
+
"relaton-model-ietf": "v1.1.2",
|
|
16
|
+
"relaton-model-iho": "v1.1.2",
|
|
17
|
+
"relaton-model-itu": "v1.1.3",
|
|
18
|
+
"relaton-model-m3aawg": "v1.0.1",
|
|
19
|
+
"relaton-model-nist": "v1.1.2",
|
|
20
|
+
"relaton-model-ribose": "v1.1.2",
|
|
21
|
+
"relaton-model-ogc": "v1.1.2",
|
|
22
|
+
"relaton-model-cen": "v1.0.1",
|
|
23
|
+
"relaton-model-ecma": "v1.0.0",
|
|
24
|
+
"relaton-model-cie": "v1.0.0",
|
|
25
|
+
"relaton-model-iana": "v1.0.0",
|
|
26
|
+
"relaton-model-omg": "v1.0.0",
|
|
27
|
+
"relaton-model-oasis": "v1.0.4",
|
|
28
|
+
"relaton-model-jis": "v1.0.2",
|
|
29
|
+
"relaton-model-etsi": "v0.1.2",
|
|
30
|
+
"relaton-model-plateau": "v0.1.0",
|
|
31
|
+
"relaton-model-ccsds": "",
|
|
32
|
+
"relaton-model-un": "v1.0.2",
|
|
33
|
+
"metanorma-model": "v2.1.6",
|
|
34
|
+
"date": "2026-04-30T03:49:24Z"
|
|
35
|
+
}
|
data/lib/relaton/bib.rb
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
require "relaton/logger"
|
|
2
|
+
require "forwardable"
|
|
3
|
+
# require "htmlentities"
|
|
4
|
+
require "bibtex"
|
|
5
|
+
require "iso639"
|
|
6
|
+
require "rfcxml"
|
|
7
|
+
require "relaton/core"
|
|
8
|
+
require_relative "version"
|
|
9
|
+
require_relative "bib/util"
|
|
10
|
+
require_relative "bib/sanitizer"
|
|
11
|
+
require_relative "bib/namespace_helper"
|
|
12
|
+
require_relative "bib/item_data"
|
|
13
|
+
require_relative "bib/model/item"
|
|
14
|
+
require_relative "bib/model/item_base"
|
|
15
|
+
require_relative "bib/model/bibitem_shared"
|
|
16
|
+
require_relative "bib/model/bibdata_shared"
|
|
17
|
+
require_relative "bib/model/bibitem"
|
|
18
|
+
require_relative "bib/model/bibdata"
|
|
19
|
+
require_relative "bib/converter/bibxml"
|
|
20
|
+
require_relative "bib/converter/bibtex"
|
|
21
|
+
require_relative "bib/converter/asciibib"
|
|
22
|
+
require_relative "bib/model/relation"
|
|
23
|
+
|
|
24
|
+
module Relaton
|
|
25
|
+
# class Error < StandardError; end
|
|
26
|
+
|
|
27
|
+
class << self
|
|
28
|
+
#
|
|
29
|
+
# Read schema versions from file
|
|
30
|
+
#
|
|
31
|
+
# @return [Hash{String=>String}] schema versions
|
|
32
|
+
#
|
|
33
|
+
def schema_versions
|
|
34
|
+
@@schema_versions ||= JSON.parse File.read(File.join(__dir__, "bib/versions.json"))
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
module Bib
|
|
39
|
+
def self.grammar_hash
|
|
40
|
+
# gem_path = File.expand_path "..", __dir__
|
|
41
|
+
# grammars_path = File.join gem_path, "grammars", "*"
|
|
42
|
+
# grammars = Dir[grammars_path].sort.map { |gp| File.read gp }.join
|
|
43
|
+
Digest::MD5.hexdigest Relaton::VERSION # grammars
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
require "mechanize"
|
|
2
|
+
|
|
3
|
+
module Relaton::Bipm
|
|
4
|
+
class Bibliography
|
|
5
|
+
GH_ENDPOINT = "https://raw.githubusercontent.com/relaton/relaton-data-bipm/refs/heads/v2/".freeze
|
|
6
|
+
|
|
7
|
+
class << self
|
|
8
|
+
# @param text [String]
|
|
9
|
+
# @return [RelatonBipm::BipmBibliographicItem]
|
|
10
|
+
def search(text, _year = nil, _opts = {}) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
|
11
|
+
Util.info "Fetching from Relaton repository ...", key: text
|
|
12
|
+
ref = text.sub(/^BIPM\s/, "")
|
|
13
|
+
item = get_bipm ref
|
|
14
|
+
unless item
|
|
15
|
+
Util.info "Not found.", key: text
|
|
16
|
+
return
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
Util.info "Found: `#{item.docidentifier[0].content}`", key: text
|
|
20
|
+
item
|
|
21
|
+
rescue Mechanize::ResponseCodeError => e
|
|
22
|
+
raise Relaton::RequestError, e.message unless e.response_code == "404"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# @return [Mechanize]
|
|
26
|
+
# def magent # rubocop:disable Metrics/MethodLength
|
|
27
|
+
# a = Mechanize.new
|
|
28
|
+
# a.request_headers = {
|
|
29
|
+
# "Accept" => "text/html,application/xhtml+xml,application/xml;q=0.9," \
|
|
30
|
+
# "image/avif,image/webp,image/apng," \
|
|
31
|
+
# "*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
|
|
32
|
+
# "Accept-Encoding" => "gzip, deflate, br",
|
|
33
|
+
# "Accept-Language" => "en-US,en;q=0.9,ru-RU;q=0.8,ru;q=0.7",
|
|
34
|
+
# "Cache-Control" => "max-age=0",
|
|
35
|
+
# "Upgrade-Insecure-Requests" => "1",
|
|
36
|
+
# }
|
|
37
|
+
# a.user_agent_alias = Mechanize::AGENT_ALIASES.map(&:first).shuffle.first
|
|
38
|
+
# # a.user_agent_alias = "Mac Safari"
|
|
39
|
+
# a
|
|
40
|
+
# end
|
|
41
|
+
|
|
42
|
+
#
|
|
43
|
+
# @param reference [String]
|
|
44
|
+
#
|
|
45
|
+
# @return [RelatonBipm::BipmBibliographicItem]
|
|
46
|
+
#
|
|
47
|
+
def get_bipm(reference) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
|
48
|
+
pubid = parse_ref reference
|
|
49
|
+
rows = search_index pubid, reference
|
|
50
|
+
return if rows.empty?
|
|
51
|
+
|
|
52
|
+
# Latest edition wins. Metrologia and SI Brochure rows carry no year,
|
|
53
|
+
# so they all score 0; the file path breaks that tie so a repeated
|
|
54
|
+
# lookup returns the same document (the index sort is not stable).
|
|
55
|
+
row = rows.max_by { |r| [r[:id].year.to_i, r[:file]] }
|
|
56
|
+
url = "#{GH_ENDPOINT}#{row[:file]}"
|
|
57
|
+
resp = Mechanize.new.get url
|
|
58
|
+
return unless resp.code == "200"
|
|
59
|
+
|
|
60
|
+
item = Item.from_yaml resp.body
|
|
61
|
+
item.fetched = Date.today.to_s
|
|
62
|
+
item
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Look the reference up in the pubid `index-v2`, narrowing the candidate
|
|
66
|
+
# rows before the match runs. `Relaton::Index::Type#search` binary-searches
|
|
67
|
+
# only when given an identifier — the same call shape ISO, OIML and JCGM
|
|
68
|
+
# use. Both sides are now `Pubid::Bipm` objects, so the bespoke `Id`
|
|
69
|
+
# grammar takes no part in a query.
|
|
70
|
+
#
|
|
71
|
+
# Two escapes sit under the narrowing, each covering a case where the
|
|
72
|
+
# query's bsearch key cannot equal its row's:
|
|
73
|
+
#
|
|
74
|
+
# 1. A bare `SI Brochure` names no edition, so it keys to `""` while its
|
|
75
|
+
# row keys to `"9e"`. The rescan finds it.
|
|
76
|
+
# 2. `CCTF Recommendation 2009-02` parses as the literal number
|
|
77
|
+
# `2009-02`, while the row keys on `2`. No row carries that number, so
|
|
78
|
+
# a rescan cannot help — only re-reading the tail as number-plus-year.
|
|
79
|
+
#
|
|
80
|
+
# @param pubid [Pubid::Bipm::Identifier] the parsed reference
|
|
81
|
+
# @param reference [String, nil] the raw reference, for the retry
|
|
82
|
+
# @return [Array<Hash>] the matching index rows
|
|
83
|
+
def search_index(pubid, reference)
|
|
84
|
+
# Reduce the query once, not once per row. `#exclude` copies the
|
|
85
|
+
# identifier, so rebuilding it per candidate dominated the lookup.
|
|
86
|
+
query_stem = stem pubid, pubid
|
|
87
|
+
rows = index.search(pubid) { |r| pubid_match? r[:id], pubid, query_stem }
|
|
88
|
+
rows = index.search { |r| pubid_match? r[:id], pubid, query_stem } if rows.empty?
|
|
89
|
+
return rows unless rows.empty?
|
|
90
|
+
|
|
91
|
+
retry_pubid = year_number_retry reference
|
|
92
|
+
retry_pubid ? search_index(retry_pubid, nil) : rows
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# Re-read a trailing `YYYY-NN` as number `NN` of year `YYYY`
|
|
96
|
+
# (`CCTF Recommendation 2009-02` → `CCTF Recommendation 2 (2009)`). Tried
|
|
97
|
+
# only after a miss, because `NNNN-NN` is also a real BIPM number
|
|
98
|
+
# (`CIPM 2005-06`), so the literal reading has to be preferred.
|
|
99
|
+
#
|
|
100
|
+
# The re-read string is a machine-derived probe, not the caller's
|
|
101
|
+
# reference, so a probe that does not parse is a miss (nil), never a
|
|
102
|
+
# malformed-reference error -- the same rule as ISO's type/stage probe.
|
|
103
|
+
#
|
|
104
|
+
# @param reference [String, nil]
|
|
105
|
+
# @return [Pubid::Bipm::Identifier, nil]
|
|
106
|
+
def year_number_retry(reference)
|
|
107
|
+
match = reference&.match(/\A(?<stem>.+)\s(?<year>\d{4})-(?<number>\d+)\z/)
|
|
108
|
+
return unless match
|
|
109
|
+
|
|
110
|
+
parse_ref "#{match[:stem]} #{match[:number].sub(/\A0+(?=\d)/, '')} (#{match[:year]})"
|
|
111
|
+
rescue ::Pubid::Errors::ParseError
|
|
112
|
+
nil
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# Compare a row's identifier with the query. Index rows are stored
|
|
116
|
+
# language- and form-neutral — verified across all committee-document and
|
|
117
|
+
# meeting rows — while a reference may name a language (`(2009, E)`) and
|
|
118
|
+
# always names a form (short `CCTF REC 2` vs long `CCTF Recommendation 2`).
|
|
119
|
+
# The year joins them when the query omits it, mirroring what `Id#==` did
|
|
120
|
+
# with `other_hash.delete(:year) unless hash[:year]`.
|
|
121
|
+
#
|
|
122
|
+
# @param row_id [Pubid::Bipm::Identifier]
|
|
123
|
+
# @param query [Pubid::Bipm::Identifier]
|
|
124
|
+
# @param query_stem [Pubid::Bipm::Identifier, nil] the reduced query, when
|
|
125
|
+
# the caller already built it once for the whole search
|
|
126
|
+
# @return [Boolean]
|
|
127
|
+
def pubid_match?(row_id, query, query_stem = nil)
|
|
128
|
+
# A bare brochure names no edition, so it is a partial reference and
|
|
129
|
+
# cannot equal the `9e v3.01` row. Match any brochure row, which is what
|
|
130
|
+
# the old `{group: "SI", type: "Brochure"}` projection already meant.
|
|
131
|
+
if query.is_a?(::Pubid::Bipm::Identifiers::SiBrochure) && query.edition.nil?
|
|
132
|
+
return row_id.is_a?(::Pubid::Bipm::Identifiers::SiBrochure)
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
return false unless row_id.instance_of?(query.class)
|
|
136
|
+
|
|
137
|
+
# `Id#==` treated a document numbered "1" and a number-less one as the
|
|
138
|
+
# same document when both carried a year, so `CIPM Resolution 1 (1879)`
|
|
139
|
+
# reached `CIPM RES (1879)`. pubid has no such rule and the six
|
|
140
|
+
# ordinal-less declarations are only addressable this way, so keep it.
|
|
141
|
+
if number_collapses?(row_id, query)
|
|
142
|
+
keys = stem_keys(query) + [:number]
|
|
143
|
+
return row_id.exclude(*keys) == query.exclude(*keys)
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
return false unless cheap_reject_passes?(row_id, query)
|
|
147
|
+
|
|
148
|
+
stem(row_id, query) == (query_stem || stem(query, query))
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
# @param row_id [Pubid::Bipm::Identifier]
|
|
152
|
+
# @param query [Pubid::Bipm::Identifier]
|
|
153
|
+
# @return [Boolean] true when one side is number-less, the other is
|
|
154
|
+
# numbered "1", and both carry a year
|
|
155
|
+
def number_collapses?(row_id, query)
|
|
156
|
+
return false unless row_id.year && query.year
|
|
157
|
+
|
|
158
|
+
numbers = [row_id.number.to_s, query.number.to_s]
|
|
159
|
+
numbers.include?("") && numbers.include?("1")
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
# Attributes the stem never removes, so stem equality implies equality on
|
|
163
|
+
# every one of them. Comparing them first cannot change the answer, it
|
|
164
|
+
# only avoids the reduction — and `#exclude` copies the identifier, which
|
|
165
|
+
# is what made an unguarded compare cost roughly 165x a plain attribute
|
|
166
|
+
# read and turned a rescan into seconds.
|
|
167
|
+
CHEAP_KEYS = %i[number group year issue article].freeze
|
|
168
|
+
|
|
169
|
+
# @param row_id [Pubid::Bipm::Identifier]
|
|
170
|
+
# @param query [Pubid::Bipm::Identifier]
|
|
171
|
+
# @return [Boolean] false as soon as one cheap attribute differs
|
|
172
|
+
def cheap_reject_passes?(row_id, query)
|
|
173
|
+
CHEAP_KEYS.all? do |key|
|
|
174
|
+
# `:year` is dropped from the stem when the query has none, so it is
|
|
175
|
+
# only significant when the query supplies one.
|
|
176
|
+
next true if key == :year && query.year.nil?
|
|
177
|
+
next true unless query.respond_to?(key) && row_id.respond_to?(key)
|
|
178
|
+
|
|
179
|
+
row_id.public_send(key).to_s == query.public_send(key).to_s
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
# @param pubid [Pubid::Bipm::Identifier] the identifier to reduce
|
|
184
|
+
# @param query [Pubid::Bipm::Identifier] the query that sets which
|
|
185
|
+
# attributes are significant
|
|
186
|
+
# @return [Pubid::Bipm::Identifier] a copy; the cached row id is untouched
|
|
187
|
+
def stem(pubid, query)
|
|
188
|
+
pubid.exclude(*stem_keys(query))
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
# @param query [Pubid::Bipm::Identifier]
|
|
192
|
+
# @return [Array<Symbol>] the attributes a match must ignore
|
|
193
|
+
def stem_keys(query)
|
|
194
|
+
keys = %i[language form]
|
|
195
|
+
keys << :year if query.year.nil?
|
|
196
|
+
keys
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
# Parse a user reference with `Pubid::Bipm`, which since pubid `a96e9f45`
|
|
200
|
+
# accepts the loose consumer forms this flavor once needed `Id` for
|
|
201
|
+
# (`CCDS Recommendation 2 (2009)`, `CIPM 111e Réunion (2022)`,
|
|
202
|
+
# `CCTF Meeting 14 (1999)`, `SI Brochure Part 1`, …) and normalizes them
|
|
203
|
+
# to BIPM's canonical spelling. An unrecognized reference raises; like
|
|
204
|
+
# ISO and 3GPP we let it propagate -- relaton-cli rescues
|
|
205
|
+
# Pubid::Errors::Error and renders "... is not a recognized standards
|
|
206
|
+
# identifier".
|
|
207
|
+
#
|
|
208
|
+
# @param reference [String]
|
|
209
|
+
# @return [Pubid::Bipm::Identifier]
|
|
210
|
+
# @raise [Pubid::Errors::ParseError]
|
|
211
|
+
def parse_ref(reference)
|
|
212
|
+
::Pubid::Bipm.parse reference
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
def index
|
|
216
|
+
Relaton::Index.find_or_create(
|
|
217
|
+
:bipm, url: "#{GH_ENDPOINT}#{INDEXFILE}.zip", file: "#{INDEXFILE}.yaml",
|
|
218
|
+
pubid_class: ::Pubid::Bipm::Identifier
|
|
219
|
+
)
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
# @param ref [String] the BIPM standard Code to look up (e..g "BIPM B-11")
|
|
223
|
+
# @param year [String] not used
|
|
224
|
+
# @param opts [Hash] not used
|
|
225
|
+
# @return [RelatonBipm::BipmBibliographicItem]
|
|
226
|
+
def get(ref, year = nil, opts = {})
|
|
227
|
+
search(ref, year, opts)
|
|
228
|
+
end
|
|
229
|
+
end
|
|
230
|
+
end
|
|
231
|
+
end
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
module Relaton
|
|
2
|
+
module Bipm
|
|
3
|
+
module Converter
|
|
4
|
+
module Asciibib
|
|
5
|
+
def self.from_item(item)
|
|
6
|
+
ToAsciibib.new(item).transform
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
class ToAsciibib < Bib::Converter::Asciibib::ToAsciibib
|
|
10
|
+
def transform
|
|
11
|
+
out = super
|
|
12
|
+
return out unless @item.ext
|
|
13
|
+
|
|
14
|
+
out << render_comment_period
|
|
15
|
+
out << render_si_aspect
|
|
16
|
+
out << render_meeting_note
|
|
17
|
+
out
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
private
|
|
21
|
+
|
|
22
|
+
def render_doctype
|
|
23
|
+
return "" unless @item.ext&.doctype
|
|
24
|
+
|
|
25
|
+
"doctype.type:: #{@item.ext.doctype.content}\n"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def render_structuredidentifiers
|
|
29
|
+
return "" unless @item.ext&.structuredidentifier
|
|
30
|
+
|
|
31
|
+
si = @item.ext.structuredidentifier
|
|
32
|
+
pref = "structuredidentifier"
|
|
33
|
+
out = "#{pref}.docnumber:: #{si.docnumber}\n"
|
|
34
|
+
out << "#{pref}.part:: #{si.part}\n" if si.part
|
|
35
|
+
out << "#{pref}.appendix:: #{si.appendix}\n" if si.appendix
|
|
36
|
+
out
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def render_comment_period
|
|
40
|
+
return "" unless @item.ext.comment_period
|
|
41
|
+
|
|
42
|
+
cp = @item.ext.comment_period
|
|
43
|
+
out = ""
|
|
44
|
+
out << "commentperiod.from:: #{cp.from}\n" if cp.from
|
|
45
|
+
out << "commentperiod.to:: #{cp.to}\n" if cp.to
|
|
46
|
+
out
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def render_si_aspect
|
|
50
|
+
return "" unless @item.ext.si_aspect
|
|
51
|
+
|
|
52
|
+
"si_aspect:: #{@item.ext.si_aspect}\n"
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def render_meeting_note
|
|
56
|
+
return "" unless @item.ext.meeting_note
|
|
57
|
+
|
|
58
|
+
"meeting_note:: #{@item.ext.meeting_note}\n"
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|