relaton 3.0.7 → 3.1.0

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.
Files changed (240) hide show
  1. checksums.yaml +4 -4
  2. data/bin/relaton +20 -0
  3. data/lib/relaton/3gpp/processor.rb +1 -1
  4. data/lib/relaton/3gpp.rb +3 -3
  5. data/lib/relaton/adobe/processor.rb +1 -1
  6. data/lib/relaton/adobe.rb +3 -3
  7. data/lib/relaton/bib/item_data.rb +2 -2
  8. data/lib/relaton/bib/model/docidentifier.rb +17 -2
  9. data/lib/relaton/bib.rb +2 -2
  10. data/lib/relaton/bibcollection.rb +146 -0
  11. data/lib/relaton/bibdata.rb +92 -0
  12. data/lib/relaton/bipm/data_outcomes_parser.rb +6 -1
  13. data/lib/relaton/bipm/processor.rb +1 -1
  14. data/lib/relaton/bipm.rb +3 -3
  15. data/lib/relaton/bsi/processor.rb +1 -1
  16. data/lib/relaton/bsi.rb +1 -1
  17. data/lib/relaton/calconnect/data_fetcher.rb +2 -2
  18. data/lib/relaton/calconnect/model/item.rb +1 -1
  19. data/lib/relaton/calconnect/processor.rb +1 -1
  20. data/lib/relaton/calconnect.rb +2 -2
  21. data/lib/relaton/ccsds/data/fetcher.rb +1 -1
  22. data/lib/relaton/ccsds/model/item.rb +1 -1
  23. data/lib/relaton/ccsds/processor.rb +1 -1
  24. data/lib/relaton/ccsds/util.rb +1 -1
  25. data/lib/relaton/ccsds.rb +1 -1
  26. data/lib/relaton/cen/processor.rb +1 -1
  27. data/lib/relaton/cen.rb +2 -2
  28. data/lib/relaton/cie/data_fetcher.rb +3 -3
  29. data/lib/relaton/cie/processor.rb +1 -1
  30. data/lib/relaton/cie.rb +2 -2
  31. data/lib/relaton/cli/base_convertor.rb +134 -0
  32. data/lib/relaton/cli/command.rb +396 -0
  33. data/lib/relaton/cli/data_fetcher.rb +20 -0
  34. data/lib/relaton/cli/frontend/dist/404.html +18 -0
  35. data/lib/relaton/cli/frontend/dist/app.iife.js +1 -0
  36. data/lib/relaton/cli/frontend/dist/style.css +3 -0
  37. data/lib/relaton/cli/frontend/index.html +14 -0
  38. data/lib/relaton/cli/frontend/package-lock.json +2945 -0
  39. data/lib/relaton/cli/frontend/package.json +29 -0
  40. data/lib/relaton/cli/frontend/public/404.html +18 -0
  41. data/lib/relaton/cli/frontend/src/App.test.ts +501 -0
  42. data/lib/relaton/cli/frontend/src/App.vue +506 -0
  43. data/lib/relaton/cli/frontend/src/app.ts +90 -0
  44. data/lib/relaton/cli/frontend/src/components/DocumentDetail.test.ts +142 -0
  45. data/lib/relaton/cli/frontend/src/components/DocumentDetail.vue +228 -0
  46. data/lib/relaton/cli/frontend/src/components/DocumentRow.vue +88 -0
  47. data/lib/relaton/cli/frontend/src/components/Icon.test.ts +44 -0
  48. data/lib/relaton/cli/frontend/src/components/Icon.vue +55 -0
  49. data/lib/relaton/cli/frontend/src/components/Pagination.vue +26 -0
  50. data/lib/relaton/cli/frontend/src/dev/main.ts +100 -0
  51. data/lib/relaton/cli/frontend/src/dev/sample-data.json +71 -0
  52. data/lib/relaton/cli/frontend/src/lib/filter.test.ts +88 -0
  53. data/lib/relaton/cli/frontend/src/lib/filter.ts +95 -0
  54. data/lib/relaton/cli/frontend/src/lib/hydrate.test.ts +102 -0
  55. data/lib/relaton/cli/frontend/src/lib/hydrate.ts +55 -0
  56. data/lib/relaton/cli/frontend/src/lib/shards.test.ts +319 -0
  57. data/lib/relaton/cli/frontend/src/lib/shards.ts +183 -0
  58. data/lib/relaton/cli/frontend/src/lib/types.ts +148 -0
  59. data/lib/relaton/cli/frontend/src/lib/url.test.ts +151 -0
  60. data/lib/relaton/cli/frontend/src/lib/url.ts +111 -0
  61. data/lib/relaton/cli/frontend/src/shims-vue.d.ts +5 -0
  62. data/lib/relaton/cli/frontend/src/styles/index.css +27 -0
  63. data/lib/relaton/cli/frontend/src/test/fetch.ts +58 -0
  64. data/lib/relaton/cli/frontend/tsconfig.json +20 -0
  65. data/lib/relaton/cli/frontend/vite.config.ts +42 -0
  66. data/lib/relaton/cli/frontend/vitest.config.ts +11 -0
  67. data/lib/relaton/cli/frontend_assets.rb +58 -0
  68. data/lib/relaton/cli/full_text_search.rb +98 -0
  69. data/lib/relaton/cli/i18n.yaml +1 -0
  70. data/lib/relaton/cli/index_item_normalizer.rb +380 -0
  71. data/lib/relaton/cli/index_site_generator.rb +1043 -0
  72. data/lib/relaton/cli/relaton_file.rb +290 -0
  73. data/lib/relaton/cli/subcommand_collection.rb +263 -0
  74. data/lib/relaton/cli/subcommand_db.rb +81 -0
  75. data/lib/relaton/cli/templates/_document.liquid +111 -0
  76. data/lib/relaton/cli/templates/_index.liquid +61 -0
  77. data/lib/relaton/cli/templates/index/page.liquid +20 -0
  78. data/lib/relaton/cli/templates/index-style.css +1017 -0
  79. data/lib/relaton/cli/util.rb +8 -0
  80. data/lib/relaton/cli/xml_convertor.rb +47 -0
  81. data/lib/relaton/cli/xml_to_html_renderer.rb +117 -0
  82. data/lib/relaton/cli/yaml_convertor.rb +102 -0
  83. data/lib/relaton/cli.rb +103 -0
  84. data/lib/relaton/core/processor.rb +1 -1
  85. data/lib/relaton/core.rb +1 -1
  86. data/lib/relaton/db/registry.rb +1 -1
  87. data/lib/relaton/db.rb +1 -1
  88. data/lib/relaton/doi/CLAUDE.md +1 -1
  89. data/lib/relaton/doi/parser.rb +2 -1
  90. data/lib/relaton/doi/processor.rb +1 -1
  91. data/lib/relaton/doi.rb +4 -4
  92. data/lib/relaton/easc/processor.rb +1 -1
  93. data/lib/relaton/easc.rb +3 -3
  94. data/lib/relaton/ecma/data_fetcher.rb +1 -1
  95. data/lib/relaton/ecma/processor.rb +1 -1
  96. data/lib/relaton/ecma.rb +2 -2
  97. data/lib/relaton/element_finder.rb +29 -0
  98. data/lib/relaton/etsi/data_fetcher.rb +2 -2
  99. data/lib/relaton/etsi/item.rb +1 -1
  100. data/lib/relaton/etsi/processor.rb +2 -2
  101. data/lib/relaton/etsi.rb +1 -1
  102. data/lib/relaton/evs/processor.rb +1 -1
  103. data/lib/relaton/evs.rb +2 -2
  104. data/lib/relaton/gb/CLAUDE.md +1 -1
  105. data/lib/relaton/gb/bibliography.rb +1 -1
  106. data/lib/relaton/gb/processor.rb +1 -1
  107. data/lib/relaton/gb.rb +2 -2
  108. data/lib/relaton/gost/processor.rb +1 -1
  109. data/lib/relaton/gost.rb +3 -3
  110. data/lib/relaton/iala/processor.rb +1 -1
  111. data/lib/relaton/iala.rb +3 -3
  112. data/lib/relaton/iana/data_fetcher.rb +1 -1
  113. data/lib/relaton/iana/processor.rb +1 -1
  114. data/lib/relaton/iana.rb +2 -2
  115. data/lib/relaton/iec/data_fetcher.rb +1 -1
  116. data/lib/relaton/iec/processor.rb +1 -1
  117. data/lib/relaton/iec.rb +2 -2
  118. data/lib/relaton/ieee/processor.rb +1 -1
  119. data/lib/relaton/ieee.rb +2 -2
  120. data/lib/relaton/ietf/CLAUDE.md +1 -1
  121. data/lib/relaton/ietf/data_fetcher.rb +1 -1
  122. data/lib/relaton/ietf/processor.rb +1 -1
  123. data/lib/relaton/ietf.rb +2 -2
  124. data/lib/relaton/iho/CLAUDE.md +3 -3
  125. data/lib/relaton/iho/bibliography.rb +41 -27
  126. data/lib/relaton/iho/hash_parser_v1.rb +1 -1
  127. data/lib/relaton/iho/processor.rb +4 -3
  128. data/lib/relaton/iho.rb +2 -2
  129. data/lib/relaton/index.rb +1 -1
  130. data/lib/relaton/isbn/processor.rb +1 -1
  131. data/lib/relaton/isbn.rb +1 -1
  132. data/lib/relaton/iso/hash_parser_v1.rb +1 -1
  133. data/lib/relaton/iso/processor.rb +1 -1
  134. data/lib/relaton/iso.rb +3 -3
  135. data/lib/relaton/itu/processor.rb +1 -1
  136. data/lib/relaton/itu.rb +3 -3
  137. data/lib/relaton/jcgm/processor.rb +1 -1
  138. data/lib/relaton/jcgm.rb +2 -2
  139. data/lib/relaton/jis/processor.rb +1 -1
  140. data/lib/relaton/jis.rb +2 -2
  141. data/lib/relaton/nist/CLAUDE.md +11 -1
  142. data/lib/relaton/nist/README.adoc +7 -1
  143. data/lib/relaton/nist/hit_collection.rb +25 -1
  144. data/lib/relaton/nist/mods_parser.rb +32 -8
  145. data/lib/relaton/nist/processor.rb +1 -1
  146. data/lib/relaton/nist/pubs_export.rb +69 -11
  147. data/lib/relaton/nist.rb +2 -2
  148. data/lib/relaton/oasis/processor.rb +1 -1
  149. data/lib/relaton/oasis.rb +2 -2
  150. data/lib/relaton/ogc/CLAUDE.md +1 -1
  151. data/lib/relaton/ogc/processor.rb +1 -1
  152. data/lib/relaton/ogc.rb +2 -2
  153. data/lib/relaton/oiml/processor.rb +1 -1
  154. data/lib/relaton/oiml.rb +2 -2
  155. data/lib/relaton/omg/CLAUDE.md +1 -1
  156. data/lib/relaton/omg/processor.rb +1 -1
  157. data/lib/relaton/omg.rb +1 -1
  158. data/lib/relaton/plateau/CLAUDE.md +1 -1
  159. data/lib/relaton/plateau/data_fetcher.rb +1 -1
  160. data/lib/relaton/plateau/processor.rb +1 -1
  161. data/lib/relaton/plateau.rb +2 -2
  162. data/lib/relaton/render/general.rb +319 -0
  163. data/lib/relaton/render/iso690/csl_import.rb +129 -0
  164. data/lib/relaton/render/iso690/element.rb +153 -0
  165. data/lib/relaton/render/iso690/elements/access.rb +44 -0
  166. data/lib/relaton/render/iso690/elements/authorizer.rb +45 -0
  167. data/lib/relaton/render/iso690/elements/citeid.rb +39 -0
  168. data/lib/relaton/render/iso690/elements/component_part.rb +97 -0
  169. data/lib/relaton/render/iso690/elements/creator.rb +267 -0
  170. data/lib/relaton/render/iso690/elements/edition.rb +97 -0
  171. data/lib/relaton/render/iso690/elements/extent.rb +71 -0
  172. data/lib/relaton/render/iso690/elements/identifier.rb +46 -0
  173. data/lib/relaton/render/iso690/elements/location.rb +73 -0
  174. data/lib/relaton/render/iso690/elements/medium.rb +32 -0
  175. data/lib/relaton/render/iso690/elements/numeration.rb +26 -0
  176. data/lib/relaton/render/iso690/elements/production.rb +111 -0
  177. data/lib/relaton/render/iso690/elements/pub_date.rb +63 -0
  178. data/lib/relaton/render/iso690/elements/series.rb +66 -0
  179. data/lib/relaton/render/iso690/elements/size.rb +45 -0
  180. data/lib/relaton/render/iso690/elements/status.rb +30 -0
  181. data/lib/relaton/render/iso690/elements/stddoc.rb +40 -0
  182. data/lib/relaton/render/iso690/elements/title.rb +56 -0
  183. data/lib/relaton/render/iso690/elements/updated.rb +38 -0
  184. data/lib/relaton/render/iso690/elements.rb +67 -0
  185. data/lib/relaton/render/iso690/fields.rb +142 -0
  186. data/lib/relaton/render/iso690/i18n/en.yml +48 -0
  187. data/lib/relaton/render/iso690/i18n/fr.yml +14 -0
  188. data/lib/relaton/render/iso690/i18n/ja.yml +38 -0
  189. data/lib/relaton/render/iso690/i18n.rb +83 -0
  190. data/lib/relaton/render/iso690/identifier_kinds.rb +29 -0
  191. data/lib/relaton/render/iso690/index_renderer.rb +57 -0
  192. data/lib/relaton/render/iso690/kinds.rb +53 -0
  193. data/lib/relaton/render/iso690/renderer.rb +150 -0
  194. data/lib/relaton/render/iso690/rules/bipm.rb +186 -0
  195. data/lib/relaton/render/iso690/rules/jis.rb +103 -0
  196. data/lib/relaton/render/iso690/rules/nist.rb +384 -0
  197. data/lib/relaton/render/iso690/rules.rb +227 -0
  198. data/lib/relaton/render/iso690/style/locale.rb +59 -0
  199. data/lib/relaton/render/iso690/style/name_form.rb +87 -0
  200. data/lib/relaton/render/iso690/style/scheme.rb +33 -0
  201. data/lib/relaton/render/iso690/style/sort_rule.rb +25 -0
  202. data/lib/relaton/render/iso690/style/template_map.rb +40 -0
  203. data/lib/relaton/render/iso690/style/type_template.rb +45 -0
  204. data/lib/relaton/render/iso690/style.rb +227 -0
  205. data/lib/relaton/render/iso690/styles/apa.yml +45 -0
  206. data/lib/relaton/render/iso690/styles/author-date.yml +31 -0
  207. data/lib/relaton/render/iso690/styles/chicago.yml +49 -0
  208. data/lib/relaton/render/iso690/styles/ieee-sa.yml +45 -0
  209. data/lib/relaton/render/iso690/styles/jis-en.yml +68 -0
  210. data/lib/relaton/render/iso690/styles/jis-ja.yml +67 -0
  211. data/lib/relaton/render/iso690/styles/lncs.yml +54 -0
  212. data/lib/relaton/render/iso690/styles/mla.yml +56 -0
  213. data/lib/relaton/render/iso690/template.rb +248 -0
  214. data/lib/relaton/render/iso690.rb +28 -0
  215. data/lib/relaton/sae/CLAUDE.md +89 -0
  216. data/lib/relaton/sae/bibdata.rb +8 -0
  217. data/lib/relaton/sae/bibitem.rb +8 -0
  218. data/lib/relaton/sae/bibliography.rb +128 -0
  219. data/lib/relaton/sae/data_fetcher.rb +219 -0
  220. data/lib/relaton/sae/doi_code.rb +83 -0
  221. data/lib/relaton/sae/item.rb +10 -0
  222. data/lib/relaton/sae/item_data.rb +6 -0
  223. data/lib/relaton/sae/processor.rb +62 -0
  224. data/lib/relaton/sae/util.rb +9 -0
  225. data/lib/relaton/sae.rb +37 -0
  226. data/lib/relaton/un/CLAUDE.md +1 -1
  227. data/lib/relaton/un/processor.rb +1 -1
  228. data/lib/relaton/un.rb +1 -1
  229. data/lib/relaton/version.rb +1 -1
  230. data/lib/relaton/w3c/bibliography.rb +1 -1
  231. data/lib/relaton/w3c/data_fetcher.rb +1 -1
  232. data/lib/relaton/w3c/processor.rb +1 -1
  233. data/lib/relaton/w3c.rb +2 -2
  234. data/lib/relaton/xsf/data_fetcher.rb +1 -1
  235. data/lib/relaton/xsf/processor.rb +1 -1
  236. data/lib/relaton/xsf.rb +2 -2
  237. data/lib/relaton-cli.rb +17 -0
  238. data/lib/relaton-render.rb +12 -0
  239. data/lib/relaton.rb +3 -2
  240. metadata +203 -23
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e5d527c7af0e73aafd66151377b063b5dee1aabc862847f463a3e2e6064851fa
4
- data.tar.gz: c07269ae1bf1b52ec8d5c6cf9e1ab3e697328327df7b4b125e0b2db70241d5ef
3
+ metadata.gz: 0bdb2921b9e783bd265ac5fa7fdcf74e464624cc817f3a321e4206602ba94fcf
4
+ data.tar.gz: 5a329642cc5ed894e9008011cb99a7f35c49c9da624b19b87dbf53d12259325f
5
5
  SHA512:
6
- metadata.gz: 6a602b0c6e67dfdb52ba5778ca98fd5370c9f54d9f53f649d235a16a19e40130c093bf1104d11c7bf0b9ca10b0872c3a7eee14e1706058da4ddc9e24ed9ac36f
7
- data.tar.gz: 2ed59dd8053ee02f22f5fc4adcba23dcc472779d78535bb41ce7fa79b591c8a792ffd9e5033b4779a8e71dbeae3a0ba450c5196fd2738f5fca2d7bba7e7bac48
6
+ metadata.gz: 9828c92364edaca6d9f56655f8e67aa0de7bdf221a2fdaf03d9fb185a8eb448337dc9f77af028133a390c392c14a273fa31b32e8ab8c00ff1b80813a58efcf9a
7
+ data.tar.gz: 05a358f667af4b048fb3503d8208c1ff60796b785719da720e1039160c66eaff3c58dc43dbda270d2171197f3636166a32bdc944682435c6d6ed4f63e393a1f8
data/bin/relaton ADDED
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ # resolve bin path, ignoring symlinks
5
+ require "pathname"
6
+ bin_file = Pathname.new(__FILE__).realpath
7
+
8
+ # add self to libpath
9
+ $:.unshift File.expand_path("../../lib", bin_file)
10
+
11
+ # Fixes https://github.com/rubygems/rubygems/issues/1420
12
+ require "rubygems/specification"
13
+
14
+ class Gem::Specification
15
+ def this; self; end
16
+ end
17
+
18
+ require "relaton-cli"
19
+
20
+ Relaton::Cli.start(ARGV)
@@ -1,4 +1,4 @@
1
- require "relaton/core/processor"
1
+ require_relative "../core/processor"
2
2
 
3
3
  module Relaton
4
4
  module ThreeGpp
data/lib/relaton/3gpp.rb CHANGED
@@ -3,9 +3,9 @@ require "net/http"
3
3
  # index code names. Processor#remove_index_file names no pubid class: the
4
4
  # delete never reads the index (see lib/relaton/index/CLAUDE.md).
5
5
  require "pubid"
6
- require "relaton/index"
7
- require "relaton/core"
8
- require "relaton/bib"
6
+ require_relative "index"
7
+ require_relative "core"
8
+ require_relative "bib"
9
9
  require_relative "version"
10
10
  require_relative "3gpp/util"
11
11
  require_relative "3gpp/item"
@@ -1,4 +1,4 @@
1
- require "relaton/core/processor"
1
+ require_relative "../core/processor"
2
2
 
3
3
  module Relaton
4
4
  module Adobe
data/lib/relaton/adobe.rb CHANGED
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "relaton/bib"
4
- require "relaton/index"
3
+ require_relative "bib"
4
+ require_relative "index"
5
5
  require "pubid"
6
- require "relaton/version"
6
+ require_relative "version"
7
7
 
8
8
  # Relaton::Adobe is the Adobe (font tech notes, character collections,
9
9
  # PostScript Language, etc.) flavor of the unified relaton gem. Adds
@@ -173,13 +173,13 @@ module Relaton
173
173
  # ISO 690 rendered reference (the style instance lives in the
174
174
  # relaton-models citation module; the engine in relaton-render).
175
175
  def to_iso690(lang: "en", script: "Latn")
176
- require "relaton/render/iso690"
176
+ require_relative "../render/iso690"
177
177
  Render::Iso690::Renderer.render(self, lang: lang, script: script)
178
178
  end
179
179
 
180
180
  # ISO 690 name-and-date in-text citation.
181
181
  def to_iso690_citation(lang: "en", script: "Latn", disambiguator: nil)
182
- require "relaton/render/iso690"
182
+ require_relative "../render/iso690"
183
183
  Render::Iso690::Renderer.citation(
184
184
  self, disambiguator: disambiguator, lang: lang, script: script
185
185
  )
@@ -66,7 +66,7 @@ module Relaton
66
66
  "BSI" => :Bsi,
67
67
  }.freeze
68
68
 
69
- FORMS = %i[external internal].freeze
69
+ FORMS = %i[external internal slug].freeze
70
70
 
71
71
  # The parsed identifier. A pubid-backed flavor subclass overrides it.
72
72
  def pubid; end
@@ -94,7 +94,22 @@ module Relaton
94
94
  def form_content(form)
95
95
  flavor = FORM_PUBID[type]
96
96
  id = flavor && (pubid || parse_form_pubid(flavor))
97
- id ? id.to_s(with_publisher: form == :external) : content
97
+ return content unless id
98
+
99
+ return slug_form(id) if form == :slug
100
+
101
+ id.to_s(with_publisher: form == :external)
102
+ end
103
+
104
+ # The pubid-scheme slug (relaton#441): the URN in HTTP-path
105
+ # clothes, bijective with Pubid.from_slug. A flavor whose
106
+ # pubid-scheme schema has not landed yet degrades to the stored
107
+ # content, like a form pubid cannot parse.
108
+ def slug_form(id)
109
+ require "pubid"
110
+ ::Pubid.to_slug(id)
111
+ rescue ::Pubid::Errors::InvalidInputError, NameError
112
+ content
98
113
  end
99
114
 
100
115
  def parse_form_pubid(flavor)
data/lib/relaton/bib.rb CHANGED
@@ -1,10 +1,10 @@
1
- require "relaton/logger"
1
+ require_relative "logger"
2
2
  require "forwardable"
3
3
  # require "htmlentities"
4
4
  require "bibtex"
5
5
  require "iso639"
6
6
  require "rfcxml"
7
- require "relaton/core"
7
+ require_relative "core"
8
8
  require "yeptris"
9
9
  require_relative "version"
10
10
  require_relative "bib/util"
@@ -0,0 +1,146 @@
1
+ require_relative "element_finder"
2
+
3
+ module Relaton
4
+ class Bibcollection
5
+ extend Relaton::ElementFinder
6
+
7
+ ATTRIBS = %i[title items doctype author].freeze
8
+
9
+ attr_accessor(*ATTRIBS)
10
+
11
+ # @param options [Hash]
12
+ def initialize(options)
13
+ ATTRIBS.each do |k|
14
+ value = options[k] || options[k.to_s]
15
+ send("#{k}=", value)
16
+ end
17
+ reduce_items
18
+ end
19
+
20
+ # arbitrary number, must sort after all bib items
21
+ def doc_number
22
+ 9999999
23
+ end
24
+
25
+ # Add a dcoument to the collection
26
+ # @param item [RelatonBib::BibliographicItem]
27
+ def <<(item)
28
+ items << new_bib_item_class(item)
29
+ end
30
+
31
+ # rubocop:disable Metrics/MethodLength
32
+
33
+ # @param source [Nokogiri::XML::Element]
34
+ def self.from_xml(source)
35
+ title = find_html("./relaton-collection/title", source)
36
+ author = find_html(
37
+ "./relaton-collection/contributor[role/@type='author']/organization/"\
38
+ "name", source
39
+ )
40
+
41
+ items = find_xpath("./relaton-collection/relation", source)&.map do |item|
42
+ bibdata = find("./bibdata|./bibitem", item)
43
+ klass = bibdata ? Bibdata : Bibcollection
44
+ klass.from_xml(bibdata || item)
45
+ end
46
+
47
+ new(title: title, author: author, items: items)
48
+ end
49
+
50
+ # rubocop:disable Metrics/AbcSize
51
+
52
+ # @param opts [Hash]
53
+ # @return [String] XML
54
+ def to_xml(opts = {})
55
+ items.sort_by! &:doc_number
56
+
57
+ collection_type = if doctype
58
+ "type=\"#{doctype}\""
59
+ else
60
+ 'xmlns="https://open.ribose.com/relaton-xml"'
61
+ end
62
+
63
+ ret = "<relaton-collection #{collection_type}>"
64
+ ret += "<title>#{xml_escape(title)}</title>" if title
65
+ if author
66
+ ret += "<contributor><role type='author'/><organization><name>"\
67
+ "#{xml_escape(author)}</name></organization></contributor>"
68
+ end
69
+ unless items.empty?
70
+ items.each do |item|
71
+ ret += "<relation type='partOf'>"
72
+ ret += item.to_xml(opts)
73
+ ret += "</relation>\n"
74
+ end
75
+ end
76
+ ret += "</relaton-collection>\n"
77
+ end
78
+ # rubocop:enable Metrics/AbcSize
79
+
80
+ # @param item [Hash, RelatonBib::BibliographicItem, Relatin::Bibdata,
81
+ # Relaton::Bibcollection]
82
+ # @return [Relaton::Bibdata, Relaton::Bibcollection]
83
+ def new_bib_item_class(item)
84
+ if item.is_a?(Hash)
85
+ if item["items"]
86
+ ::Relaton::Bibcollection.new(item)
87
+ else
88
+ bibitem = ::Relaton::Cli::YAMLConvertor.convert_single_file item
89
+ ::Relaton::Bibdata.new bibitem
90
+ end
91
+ elsif item.is_a?(Relaton::Bibdata) || item.is_a?(Relaton::Bibcollection)
92
+ item
93
+ else ::Relaton::Bibdata.new(item)
94
+ end
95
+ end
96
+ # rubocop:enable Metrics/MethodLength
97
+
98
+ def items_flattened
99
+ items.sort_by! &:doc_number
100
+
101
+ items.reduce([]) do |acc, item|
102
+ acc << if item.is_a? ::Relaton::Bibcollection
103
+ item.items_flattened
104
+ else
105
+ item
106
+ end
107
+ end
108
+ end
109
+
110
+ def to_yaml
111
+ to_h.to_yaml
112
+ end
113
+
114
+ def to_h
115
+ items.sort_by! &:doc_number
116
+
117
+ a = ATTRIBS.reduce({}) do |acc, k|
118
+ acc[k.to_s] = send(k)
119
+ acc
120
+ end
121
+
122
+ a["items"] = a["items"].map(&:to_h)
123
+
124
+ { "root" => a }
125
+ end
126
+
127
+ private
128
+
129
+ def reduce_items
130
+ self.items = (items || []).reduce([]) do |acc, item|
131
+ acc << if item.is_a?(Bibcollection) || item.is_a?(Bibdata)
132
+ item
133
+ else new_bib_item_class(item)
134
+ end
135
+ end
136
+ end
137
+
138
+ # Escape bare & in content for XML serialization, leaving already-encoded
139
+ # entity references (&amp;, &#123;, &#x1f;) and inline markup (<em> etc.)
140
+ # untouched. This prevents invalid XML when plain-text values (e.g. from
141
+ # YAML) contain literal ampersands.
142
+ def xml_escape(str)
143
+ str.gsub(/&(?![a-zA-Z][a-zA-Z0-9]*;|#[0-9]+;|#x[0-9a-fA-F]+;)/, "&amp;")
144
+ end
145
+ end
146
+ end
@@ -0,0 +1,92 @@
1
+ require "date"
2
+
3
+ module Relaton
4
+ class Bibdata
5
+ URL_TYPES = %i[uri xml pdf doc html rxl txt].freeze
6
+
7
+ # @return [RelatonBib::BibliographicItem]
8
+ attr_reader :bibitem
9
+
10
+ # @param bibitem [RelatonBib::BibliographicItem]
11
+ def initialize(bibitem)
12
+ @bibitem = bibitem
13
+ end
14
+
15
+ def docidentifier
16
+ @bibitem.docidentifier.first&.content&.to_s
17
+ end
18
+
19
+ # def doctype
20
+ # @bibitem.type
21
+ # end
22
+
23
+ # From http://gavinmiller.io/2016/creating-a-secure-sanitization-function/
24
+ FILENAME_BAD_CHARS = ["/", '\\', "?", "%", "*", ":", "|", '"', "<", ">",
25
+ ".", " "].freeze
26
+
27
+ def docidentifier_code
28
+ return "" if docidentifier.nil?
29
+
30
+ FILENAME_BAD_CHARS.reduce(docidentifier.downcase) do |result, bad_char|
31
+ result.gsub(bad_char, "-")
32
+ end
33
+ end
34
+
35
+ DOC_NUMBER_REGEX = /([\w\/]+)\s+(\d+):?(\d*)/.freeze
36
+ def doc_number
37
+ docidentifier&.match(DOC_NUMBER_REGEX) ? $2.to_i : 999999
38
+ end
39
+
40
+ def self.from_xml(source)
41
+ bi = Relaton::Cli.parse_xml(source)
42
+ new(bi) if bi
43
+ end
44
+
45
+ def to_xml(opts = {})
46
+ options = { bibdata: true, date_format: :full }.merge(
47
+ opts.select { |k, _v| k.is_a? Symbol },
48
+ )
49
+ @bibitem.to_xml(**options)
50
+ end
51
+
52
+ def to_h
53
+ URL_TYPES.each_with_object(YAML.safe_load(@bibitem.to_yaml)) do |t, h|
54
+ value = send t
55
+ h[t.to_s] = value if value
56
+ end
57
+ end
58
+
59
+ def to_yaml
60
+ to_h.to_yaml
61
+ end
62
+
63
+ # rubocop:disable Metrics/CyclomaticComplexity, Metrics/AbcSize
64
+ # rubocop:disable Metrics/MethodLength, Metrics/PerceivedComplexity, Style/MissingRespondToMissing
65
+
66
+ def method_missing(meth, *args)
67
+ if @bibitem.respond_to?(meth)
68
+ @bibitem.send meth, *args
69
+ elsif URL_TYPES.include? meth
70
+ source = (@bibitem.source || []).detect do |l|
71
+ l.type == meth.to_s || (meth == :uri && l.type.nil?)
72
+ end
73
+ source&.content&.to_s
74
+ elsif URL_TYPES.include? meth.match(/^\w+(?==)/).to_s.to_sym
75
+ /^(?<type>\w+)/ =~ meth
76
+ @bibitem.source ||= []
77
+ source = @bibitem.source.detect do |l|
78
+ l.type == type || (type == "uri" && l.type.nil?)
79
+ end
80
+ if source
81
+ source.content = args[0]
82
+ else
83
+ @bibitem.source << Relaton::Bib::Uri.new(type: type, content: args[0])
84
+ end
85
+ else
86
+ super
87
+ end
88
+ end
89
+ # rubocop:enable Metrics/CyclomaticComplexity, Metrics/AbcSize
90
+ # rubocop:enable Metrics/MethodLength, Metrics/PerceivedComplexity, Style/MissingRespondToMissing
91
+ end
92
+ end
@@ -94,9 +94,14 @@ module Relaton::Bipm
94
94
  @data_fetcher.write_file path, has_part_item, warn_duplicate: false
95
95
  path = File.join dir, "#{num}-#{part}.#{@data_fetcher.ext}"
96
96
  elsif part
97
- hash[:title].each { |t| t.content.sub!(/\s\(.+\)$/, "") }
97
+ # The part item keeps the full titles ("… (Session I)"); the base
98
+ # item's titles drop the parenthetical. Assign the stripped form -
99
+ # `Title#content` exposes the source metadata string, and a
100
+ # mutating `sub!` would strip the part item's title too (the two
101
+ # share the string object).
98
102
  h = meeting_bibitem body: body, type: type, en: en_md, fr: fr_md, num: num, src: src, pdf: en["pdf"]
99
103
  add_part h, body, type, num, part
104
+ hash[:title].each { |t| t.content = t.content.sub(/\s\(.+\)$/, "") }
100
105
  part_item = ItemData.new(**h)
101
106
  part_item_path = File.join dir, "#{num}-#{part}.#{@data_fetcher.ext}"
102
107
  @data_fetcher.write_file part_item_path, part_item
@@ -1,4 +1,4 @@
1
- require "relaton/core/processor"
1
+ require_relative "../core/processor"
2
2
 
3
3
  module Relaton
4
4
  module Bipm
data/lib/relaton/bipm.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  require "zip"
2
2
  require "fileutils"
3
- require "relaton/bib"
4
- require "relaton/index"
5
- require "relaton/core"
3
+ require_relative "bib"
4
+ require_relative "index"
5
+ require_relative "core"
6
6
  require "pubid"
7
7
  require_relative "version"
8
8
  require_relative "bipm/util"
@@ -1,4 +1,4 @@
1
- require "relaton/core/processor"
1
+ require_relative "../core/processor"
2
2
 
3
3
  module Relaton::Bsi
4
4
  class Processor < Relaton::Core::Processor
data/lib/relaton/bsi.rb CHANGED
@@ -1,4 +1,4 @@
1
- require "relaton/iso"
1
+ require_relative "iso"
2
2
  require_relative "version"
3
3
  require_relative "bsi/util"
4
4
  require_relative "bsi/item_data"
@@ -2,8 +2,8 @@ require "yeptris"
2
2
  # frozen_string_literal:true
3
3
 
4
4
  require "mechanize"
5
- require "relaton/core"
6
- require "relaton/index"
5
+ require_relative "../core"
6
+ require_relative "../index"
7
7
  # The flavor top-level, for INDEXFILE and ::Pubid::Calconnect::Identifier.
8
8
  # `relaton-data-calconnect`'s crawler requires THIS file and nothing else, so
9
9
  # without it `#index` NameErrors on the very first document. (The ECMA form;
@@ -1,4 +1,4 @@
1
- require "relaton/bib"
1
+ require_relative "../../bib"
2
2
  require_relative "../item_data"
3
3
  require_relative "../docidentifier"
4
4
  require_relative "ext"
@@ -1,4 +1,4 @@
1
- require "relaton/core/processor"
1
+ require_relative "../core/processor"
2
2
 
3
3
  module Relaton::Calconnect
4
4
  class Processor < Relaton::Core::Processor
@@ -3,8 +3,8 @@
3
3
  # (The ECMA/IANA/IHO/OGC form; spec/relaton/lazy_loading_spec.rb guards that
4
4
  # this file is not itself loaded when a Db is built.)
5
5
  require "pubid"
6
- require "relaton/index"
7
- require "relaton/core"
6
+ require_relative "index"
7
+ require_relative "core"
8
8
  require_relative "version"
9
9
  require_relative "calconnect/model/item"
10
10
  require_relative "calconnect/util"
@@ -1,7 +1,7 @@
1
1
  require "yeptris"
2
2
  require "json"
3
3
  require "mechanize"
4
- require "relaton/index"
4
+ require_relative "../../index"
5
5
  require "pubid"
6
6
  require_relative "../../ccsds"
7
7
  require_relative "parser"
@@ -1,4 +1,4 @@
1
- require "relaton/bib"
1
+ require_relative "../../bib"
2
2
  require_relative "../item_data"
3
3
  require_relative "docidentifier"
4
4
  require_relative "ext"
@@ -1,4 +1,4 @@
1
- require "relaton/core/processor"
1
+ require_relative "../core/processor"
2
2
 
3
3
  module Relaton
4
4
  module Ccsds
@@ -1,4 +1,4 @@
1
- require "relaton/bib/util"
1
+ require_relative "../bib/util"
2
2
 
3
3
  module Relaton
4
4
  module Ccsds
data/lib/relaton/ccsds.rb CHANGED
@@ -3,7 +3,7 @@
3
3
  # require "mechanize"
4
4
  # require "relaton/core"
5
5
  # require "relaton/bib"
6
- require "relaton/index"
6
+ require_relative "index"
7
7
  require "pubid"
8
8
  require_relative "version"
9
9
  # require_relative "ccsds/processor"
@@ -1,4 +1,4 @@
1
- require "relaton/core/processor"
1
+ require_relative "../core/processor"
2
2
 
3
3
  module Relaton
4
4
  module Cen
data/lib/relaton/cen.rb CHANGED
@@ -2,10 +2,10 @@
2
2
 
3
3
  require "digest/md5"
4
4
  require "mechanize"
5
- require "relaton/core"
5
+ require_relative "core"
6
6
  require "isoics"
7
7
  require "pubid"
8
- require "relaton/bib"
8
+ require_relative "bib"
9
9
  require_relative "version"
10
10
  require_relative "cen/util"
11
11
  require_relative "cen/model/item"
@@ -5,9 +5,9 @@ require "fileutils"
5
5
  require "ferrum"
6
6
  require "moxml"
7
7
  require "pubid"
8
- require "relaton/index"
9
- require "relaton/bib"
10
- require "relaton/core/data_fetcher"
8
+ require_relative "../index"
9
+ require_relative "../bib"
10
+ require_relative "../core/data_fetcher"
11
11
  require_relative "../cie"
12
12
 
13
13
  module Relaton
@@ -1,4 +1,4 @@
1
- require "relaton/core/processor"
1
+ require_relative "../core/processor"
2
2
 
3
3
  module Relaton
4
4
  module Cie
data/lib/relaton/cie.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  require "moxml"
2
2
  # require "parslet"
3
3
  require "pubid"
4
- require "relaton/index"
5
- require "relaton/bib"
4
+ require_relative "index"
5
+ require_relative "bib"
6
6
  # require "relaton_bib/name_parser"
7
7
  require_relative "version"
8
8
  require_relative "cie/authors_parser"