relaton 3.0.6 → 3.0.8

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 (134) hide show
  1. checksums.yaml +4 -4
  2. data/bin/relaton +20 -0
  3. data/lib/relaton/bib/model/docidentifier.rb +17 -2
  4. data/lib/relaton/bibcollection.rb +146 -0
  5. data/lib/relaton/bibdata.rb +92 -0
  6. data/lib/relaton/bipm/data_outcomes_parser.rb +6 -1
  7. data/lib/relaton/cli/base_convertor.rb +134 -0
  8. data/lib/relaton/cli/command.rb +390 -0
  9. data/lib/relaton/cli/data_fetcher.rb +20 -0
  10. data/lib/relaton/cli/frontend/dist/404.html +18 -0
  11. data/lib/relaton/cli/frontend/dist/app.iife.js +1 -0
  12. data/lib/relaton/cli/frontend/dist/style.css +3 -0
  13. data/lib/relaton/cli/frontend/index.html +14 -0
  14. data/lib/relaton/cli/frontend/package-lock.json +2945 -0
  15. data/lib/relaton/cli/frontend/package.json +29 -0
  16. data/lib/relaton/cli/frontend/public/404.html +18 -0
  17. data/lib/relaton/cli/frontend/src/App.test.ts +501 -0
  18. data/lib/relaton/cli/frontend/src/App.vue +506 -0
  19. data/lib/relaton/cli/frontend/src/app.ts +90 -0
  20. data/lib/relaton/cli/frontend/src/components/DocumentDetail.test.ts +142 -0
  21. data/lib/relaton/cli/frontend/src/components/DocumentDetail.vue +228 -0
  22. data/lib/relaton/cli/frontend/src/components/DocumentRow.vue +88 -0
  23. data/lib/relaton/cli/frontend/src/components/Icon.test.ts +44 -0
  24. data/lib/relaton/cli/frontend/src/components/Icon.vue +55 -0
  25. data/lib/relaton/cli/frontend/src/components/Pagination.vue +26 -0
  26. data/lib/relaton/cli/frontend/src/dev/main.ts +100 -0
  27. data/lib/relaton/cli/frontend/src/dev/sample-data.json +71 -0
  28. data/lib/relaton/cli/frontend/src/lib/filter.test.ts +88 -0
  29. data/lib/relaton/cli/frontend/src/lib/filter.ts +95 -0
  30. data/lib/relaton/cli/frontend/src/lib/hydrate.test.ts +102 -0
  31. data/lib/relaton/cli/frontend/src/lib/hydrate.ts +55 -0
  32. data/lib/relaton/cli/frontend/src/lib/shards.test.ts +319 -0
  33. data/lib/relaton/cli/frontend/src/lib/shards.ts +183 -0
  34. data/lib/relaton/cli/frontend/src/lib/types.ts +148 -0
  35. data/lib/relaton/cli/frontend/src/lib/url.test.ts +151 -0
  36. data/lib/relaton/cli/frontend/src/lib/url.ts +111 -0
  37. data/lib/relaton/cli/frontend/src/shims-vue.d.ts +5 -0
  38. data/lib/relaton/cli/frontend/src/styles/index.css +27 -0
  39. data/lib/relaton/cli/frontend/src/test/fetch.ts +58 -0
  40. data/lib/relaton/cli/frontend/tsconfig.json +20 -0
  41. data/lib/relaton/cli/frontend/vite.config.ts +42 -0
  42. data/lib/relaton/cli/frontend/vitest.config.ts +11 -0
  43. data/lib/relaton/cli/frontend_assets.rb +58 -0
  44. data/lib/relaton/cli/full_text_search.rb +98 -0
  45. data/lib/relaton/cli/i18n.yaml +1 -0
  46. data/lib/relaton/cli/index_item_normalizer.rb +380 -0
  47. data/lib/relaton/cli/index_site_generator.rb +1015 -0
  48. data/lib/relaton/cli/relaton_file.rb +290 -0
  49. data/lib/relaton/cli/subcommand_collection.rb +263 -0
  50. data/lib/relaton/cli/subcommand_db.rb +81 -0
  51. data/lib/relaton/cli/templates/_document.liquid +111 -0
  52. data/lib/relaton/cli/templates/_index.liquid +61 -0
  53. data/lib/relaton/cli/templates/index/page.liquid +20 -0
  54. data/lib/relaton/cli/templates/index-style.css +1017 -0
  55. data/lib/relaton/cli/util.rb +8 -0
  56. data/lib/relaton/cli/version.rb +11 -0
  57. data/lib/relaton/cli/xml_convertor.rb +47 -0
  58. data/lib/relaton/cli/xml_to_html_renderer.rb +117 -0
  59. data/lib/relaton/cli/yaml_convertor.rb +102 -0
  60. data/lib/relaton/cli.rb +113 -0
  61. data/lib/relaton/doi/CLAUDE.md +1 -1
  62. data/lib/relaton/element_finder.rb +29 -0
  63. data/lib/relaton/gb/CLAUDE.md +1 -1
  64. data/lib/relaton/ietf/CLAUDE.md +1 -1
  65. data/lib/relaton/iho/CLAUDE.md +3 -3
  66. data/lib/relaton/iho/bibliography.rb +41 -27
  67. data/lib/relaton/iho/processor.rb +3 -2
  68. data/lib/relaton/nist/CLAUDE.md +11 -1
  69. data/lib/relaton/nist/README.adoc +7 -1
  70. data/lib/relaton/nist/hit_collection.rb +25 -1
  71. data/lib/relaton/nist/mods_parser.rb +32 -8
  72. data/lib/relaton/nist/pubs_export.rb +69 -11
  73. data/lib/relaton/ogc/CLAUDE.md +1 -1
  74. data/lib/relaton/omg/CLAUDE.md +1 -1
  75. data/lib/relaton/plateau/CLAUDE.md +1 -1
  76. data/lib/relaton/render/general.rb +319 -0
  77. data/lib/relaton/render/iso690/csl_import.rb +129 -0
  78. data/lib/relaton/render/iso690/element.rb +153 -0
  79. data/lib/relaton/render/iso690/elements/access.rb +44 -0
  80. data/lib/relaton/render/iso690/elements/authorizer.rb +45 -0
  81. data/lib/relaton/render/iso690/elements/citeid.rb +39 -0
  82. data/lib/relaton/render/iso690/elements/component_part.rb +97 -0
  83. data/lib/relaton/render/iso690/elements/creator.rb +267 -0
  84. data/lib/relaton/render/iso690/elements/edition.rb +97 -0
  85. data/lib/relaton/render/iso690/elements/extent.rb +71 -0
  86. data/lib/relaton/render/iso690/elements/identifier.rb +46 -0
  87. data/lib/relaton/render/iso690/elements/location.rb +73 -0
  88. data/lib/relaton/render/iso690/elements/medium.rb +32 -0
  89. data/lib/relaton/render/iso690/elements/numeration.rb +26 -0
  90. data/lib/relaton/render/iso690/elements/production.rb +111 -0
  91. data/lib/relaton/render/iso690/elements/pub_date.rb +63 -0
  92. data/lib/relaton/render/iso690/elements/series.rb +66 -0
  93. data/lib/relaton/render/iso690/elements/size.rb +45 -0
  94. data/lib/relaton/render/iso690/elements/status.rb +30 -0
  95. data/lib/relaton/render/iso690/elements/stddoc.rb +40 -0
  96. data/lib/relaton/render/iso690/elements/title.rb +56 -0
  97. data/lib/relaton/render/iso690/elements/updated.rb +38 -0
  98. data/lib/relaton/render/iso690/elements.rb +67 -0
  99. data/lib/relaton/render/iso690/fields.rb +142 -0
  100. data/lib/relaton/render/iso690/i18n/en.yml +48 -0
  101. data/lib/relaton/render/iso690/i18n/fr.yml +14 -0
  102. data/lib/relaton/render/iso690/i18n/ja.yml +38 -0
  103. data/lib/relaton/render/iso690/i18n.rb +83 -0
  104. data/lib/relaton/render/iso690/identifier_kinds.rb +29 -0
  105. data/lib/relaton/render/iso690/index_renderer.rb +57 -0
  106. data/lib/relaton/render/iso690/kinds.rb +53 -0
  107. data/lib/relaton/render/iso690/renderer.rb +150 -0
  108. data/lib/relaton/render/iso690/rules/bipm.rb +186 -0
  109. data/lib/relaton/render/iso690/rules/jis.rb +103 -0
  110. data/lib/relaton/render/iso690/rules/nist.rb +384 -0
  111. data/lib/relaton/render/iso690/rules.rb +227 -0
  112. data/lib/relaton/render/iso690/style/locale.rb +59 -0
  113. data/lib/relaton/render/iso690/style/name_form.rb +87 -0
  114. data/lib/relaton/render/iso690/style/scheme.rb +33 -0
  115. data/lib/relaton/render/iso690/style/sort_rule.rb +25 -0
  116. data/lib/relaton/render/iso690/style/template_map.rb +40 -0
  117. data/lib/relaton/render/iso690/style/type_template.rb +45 -0
  118. data/lib/relaton/render/iso690/style.rb +227 -0
  119. data/lib/relaton/render/iso690/styles/apa.yml +45 -0
  120. data/lib/relaton/render/iso690/styles/author-date.yml +31 -0
  121. data/lib/relaton/render/iso690/styles/chicago.yml +49 -0
  122. data/lib/relaton/render/iso690/styles/ieee-sa.yml +45 -0
  123. data/lib/relaton/render/iso690/styles/jis-en.yml +68 -0
  124. data/lib/relaton/render/iso690/styles/jis-ja.yml +67 -0
  125. data/lib/relaton/render/iso690/styles/lncs.yml +54 -0
  126. data/lib/relaton/render/iso690/styles/mla.yml +56 -0
  127. data/lib/relaton/render/iso690/template.rb +248 -0
  128. data/lib/relaton/render/iso690.rb +28 -0
  129. data/lib/relaton/render/version.rb +5 -0
  130. data/lib/relaton/un/CLAUDE.md +1 -1
  131. data/lib/relaton/version.rb +1 -1
  132. data/lib/relaton-cli.rb +17 -0
  133. data/lib/relaton-render.rb +13 -0
  134. metadata +192 -21
@@ -0,0 +1,248 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Relaton
4
+ module Render
5
+ module Iso690
6
+ # A citation template as declared in a style instance: literal text
7
+ # interleaved with {{slot}} placeholders resolved against the ISO 690
8
+ # data element inventory. A leading literal attaches to the first
9
+ # slot, and a literal between two slots to the preceding one, so an
10
+ # absent field never orphans punctuation around it. The last rendered
11
+ # slot gives up its trailing literal in favour of the template
12
+ # terminator, appended once when any field rendered and the output
13
+ # does not already end with it.
14
+ class Template
15
+ SLOT = /\{\{\s*([\w-]+)\s*\}\}/.freeze
16
+
17
+ Field = Struct.new(:present?, :text)
18
+
19
+ def initialize(source)
20
+ @chunks = []
21
+ @terminator = ""
22
+ scan(source.to_s)
23
+ end
24
+
25
+ # The short cite renders the reference with the first-biblio
26
+ # marker appended to its first component: isodoc's styled
27
+ # references (eref2linkshort) split there (the 1.x
28
+ # fmt-first-biblio-delim)
29
+ def evaluate_short(fields, delim)
30
+ present = present_indices(fields)
31
+ return "" if present.empty?
32
+
33
+ # The split marker follows the leading run of present slots
34
+ # (the 1.x first SEGMENT: "{{creator}}{{role}}" splits after
35
+ # the role), before the first literal that follows it
36
+ lead_slots = []
37
+ @chunks.each_with_index do |(kind, _value), i|
38
+ break if kind != :slot || !present.include?(i)
39
+
40
+ lead_slots << i
41
+ end
42
+ split_at = lead_slots.last ? lead_slots.last + 1 : nil
43
+
44
+ out = +""
45
+ @chunks.each_with_index do |(kind, value), i|
46
+ text =
47
+ case kind
48
+ when :slot
49
+ field = fields[normalise(value)]
50
+ next unless field&.present?
51
+
52
+ field.text
53
+ else
54
+ next unless bridged?(i, present)
55
+
56
+ value
57
+ end
58
+ if split_at == i
59
+ out << fieldless(lead_slots, fields) if false
60
+ out << delim.to_s
61
+ split_at = nil
62
+ end
63
+ out << text unless text.nil?
64
+ end
65
+ out << delim.to_s if split_at == @chunks.length
66
+ terminate(out).rstrip
67
+ end
68
+
69
+ # 1.x segment-join semantics: present elements joined with the
70
+ # template's separators — a literal renders only when it
71
+ # separates (a run of absent elements between) two present
72
+ # elements; leading and trailing literals drop with the
73
+ # elements they would have attached to
74
+ def evaluate(fields)
75
+ present = present_indices(fields)
76
+ return "" if present.empty?
77
+
78
+ out = +"".dup
79
+ # Parenthetical groups balance on the template's literal
80
+ # parens alone: data text (a series run "(N.S.)", a host
81
+ # creator's closing paren) carries parens of its own that
82
+ # are no part of the template's group structure
83
+ paren_balance = 0
84
+ @chunks.each_with_index do |(kind, value), i|
85
+ if kind == :slot
86
+ field = fields[normalise(value)]
87
+ out << field.text if field&.present?
88
+ elsif value.to_s.match?(/\A[))]/)
89
+ # Symmetric close: with no pending open the close-paren
90
+ # drops, and any trailing punctuation bridges normally
91
+ closes = value.to_s[/\A[))]+/]
92
+ emitted = [paren_balance, closes.size].min
93
+ if emitted.positive?
94
+ out << closes[0, emitted] +
95
+ value.to_s[closes.size..].to_s
96
+ paren_balance -= emitted
97
+ else
98
+ rest = value.to_s.sub(/\A[))]+/, "")
99
+ # the trailing separator of a dropped group bridges as
100
+ # though the group were never there
101
+ if !rest.empty? && present.any? { |j| j > i } &&
102
+ group_gap?(i, present)
103
+ out << rest
104
+ end
105
+ end
106
+ elsif value.to_s.match?(/[((]\z/)
107
+ # A literal opening a parenthetical group ("({{series}})",
108
+ # "。({{series}})") attaches its paren to the slot it
109
+ # opens — the pair drops with an absent element, while
110
+ # any leading punctuation bridges normally
111
+ lead, paren = value.to_s.match(/\A(.*)([((])\z/).captures
112
+ out << lead if bridged_text?(i, lead, present)
113
+ if present.include?(i + 1)
114
+ out << paren
115
+ paren_balance += 1
116
+ end
117
+ elsif bridged?(i, present) ||
118
+ (value.include?("<") && present.any? { |j| j < i })
119
+ # markup attaches to the element it closes
120
+ out << value
121
+ elsif close_pending_paren?(out, value)
122
+ out << value
123
+ end
124
+ end
125
+ terminate(out).rstrip
126
+ end
127
+
128
+ private
129
+
130
+ def scan(source)
131
+ rest = source
132
+ while (slot = SLOT.match(rest))
133
+ @chunks << [:text, rest[0...slot.begin(0)]] if
134
+ slot.begin(0).positive?
135
+ @chunks << [:slot, slot[1]]
136
+ rest = rest[slot.end(0)..]
137
+ end
138
+ @terminator = rest
139
+ end
140
+
141
+ def present_indices(fields)
142
+ @chunks.each_index.select do |i|
143
+ kind, value = @chunks[i]
144
+ next false unless kind == :slot
145
+
146
+ field = fields[normalise(value)]
147
+ !field.nil? && field.present?
148
+ end
149
+ end
150
+
151
+ # The texts between this close and the last present slot are
152
+ # all parenthetical-group parts (each dropped or partial)
153
+ def group_gap?(index, present)
154
+ left = present.select { |i| i < index }.max
155
+ @chunks[(left + 1)...index].all? do |(_, text)|
156
+ text.to_s.match?(/\A[))]|[((]\z/)
157
+ end
158
+ end
159
+
160
+ # The leading punctuation of a paren-opening literal bridges
161
+ # per the segment-join rule (a bare paren has no lead)
162
+ def bridged_text?(index, lead, present)
163
+ return true if lead.empty?
164
+
165
+ first_slot = @chunks.index { |(kind, _)| kind == :slot }
166
+ return present.include?(first_slot) if index < first_slot
167
+
168
+ left = present.select { |i| i < index }.max
169
+ left && present.any? { |i| i > index } &&
170
+ !@chunks[(left + 1)...index].any? do |(kind, _)|
171
+ kind == :text
172
+ end
173
+ end
174
+
175
+ # A literal is the trailing separator of the element that
176
+ # precedes it: it renders when that element renders and a
177
+ # later element renders, and it is the FIRST literal of its
178
+ # gap (the 1.x segment join — absent elements between two
179
+ # present ones leave the single separator that follows the
180
+ # earlier present element; an absent slot directly before a
181
+ # present one, as "{{date}}{{disambiguator}}, {{access}}",
182
+ # does not swallow it). A leading literal (no slot precedes
183
+ # it) attaches to the first slot, emitting only when that
184
+ # slot is present.
185
+ def bridged?(index, present)
186
+ first_slot = @chunks.index { |(kind, _)| kind == :slot }
187
+ return present.include?(first_slot) if index < first_slot
188
+
189
+ left = present.select { |i| i < index }.max
190
+ left && present.any? { |i| i > index } &&
191
+ !@chunks[(left + 1)...index].any? do |(kind, _)|
192
+ kind == :text
193
+ end
194
+ end
195
+
196
+ # A template's paired literal ("({{production}})") closes even
197
+ # when nothing follows the present element it wraps. Fullwidth
198
+ # parens (CJK) pair the same way
199
+ def close_pending_paren?(out, value)
200
+ return false unless value.start_with?(")", "\uFF09")
201
+
202
+ opens = out.count("(") + out.count("\uFF08")
203
+ closes = out.count(")") + out.count("\uFF09")
204
+ opens > closes
205
+ end
206
+
207
+ def terminate(body)
208
+ # 1.x punctuation cleanup: a sentence period before a spaced
209
+ # comma yields to the comma (", 2013" over ". , 2013"; an
210
+ # initials period before a comma ("P.,") stands, being
211
+ # unspaced), and stacked separators around absent elements
212
+ # collapse into one (". : ." into ". "); an empty pair left
213
+ # by an absent element drops
214
+ body = body.gsub(/:\s*\.\s*/, ": ")
215
+ body = body.gsub(/\.\s+,/, ",")
216
+ body = body.gsub(/(?:[.,:;]\s+)+[.,:;]/, ". ")
217
+ body = body.gsub(/\.\s*\./, ". ")
218
+ body = body.gsub(/:\s*\.\s*/, ": ")
219
+ body = body.gsub(/\(\s*\)/, "")
220
+ body = body.gsub(/ +/, " ").gsub(" ,", ",")
221
+ terminator = unbalanced_close(body, @terminator)
222
+ return body if terminator.strip.empty?
223
+ if terminator !~ /[<\w]/ && body.rstrip.end_with?(terminator.strip)
224
+ return body
225
+ end
226
+
227
+ "#{body}#{terminator}"
228
+ end
229
+
230
+ # The terminator's closing parens stand only when the body
231
+ # opened them (their "(" died with an absent element)
232
+ def unbalanced_close(body, terminator)
233
+ return terminator unless terminator.start_with?(")")
234
+
235
+ open = body.count("(") - body.count(")")
236
+ return terminator.sub(/\A\)+/) { |closes| closes[0, open] } if
237
+ open.positive?
238
+
239
+ terminator.sub(/\A\)+/, "")
240
+ end
241
+
242
+ def normalise(slot)
243
+ slot.to_s.delete("_").downcase
244
+ end
245
+ end
246
+ end
247
+ end
248
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Relaton
4
+ module Render
5
+ # Citation rendering per the ISO 690 architecture: a style instance
6
+ # places the inventory's data elements (clause 7) in each resource
7
+ # kind's order (clause 8); the engine is a template evaluator over a
8
+ # field resolver and holds no styles, no vocabularies, no i18n.
9
+ # The v1 compatibility facade (relaton-render#90): isodoc's
10
+ # render-isodoc subclasses Relaton::Render::General.
11
+ autoload :General, "relaton/render/general"
12
+
13
+ module Iso690
14
+ autoload :Element, "relaton/render/iso690/element"
15
+ autoload :Elements, "relaton/render/iso690/elements"
16
+ autoload :Fields, "relaton/render/iso690/fields"
17
+ autoload :I18n, "relaton/render/iso690/i18n"
18
+ autoload :IndexRenderer, "relaton/render/iso690/index_renderer"
19
+ autoload :IdentifierKinds, "relaton/render/iso690/identifier_kinds"
20
+ autoload :Kinds, "relaton/render/iso690/kinds"
21
+ autoload :Renderer, "relaton/render/iso690/renderer"
22
+ autoload :Rules, "relaton/render/iso690/rules"
23
+ autoload :Style, "relaton/render/iso690/style"
24
+ autoload :CslImport, "relaton/render/iso690/csl_import"
25
+ autoload :Template, "relaton/render/iso690/template"
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,5 @@
1
+ module Relaton
2
+ module Render
3
+ VERSION = "3.0.0".freeze
4
+ end
5
+ end
@@ -88,4 +88,4 @@ Tests are round-trip serialization tests: load a fixture, serialize to XML/YAML,
88
88
  - **relaton-bib** (~> 2.0.0-alpha.1) — base bibliographic model with LutaML-Model integration
89
89
  - **faraday** — HTTP client
90
90
  - **ruby-jing** (dev) — RelaxNG schema validation in tests
91
- - **equivalent-xml** (dev) — XML comparison in tests
91
+ - **canon** (dev) — XML comparison in tests
@@ -1,3 +1,3 @@
1
1
  module Relaton
2
- VERSION = "3.0.6".freeze
2
+ VERSION = "3.0.8".freeze
3
3
  end
@@ -0,0 +1,17 @@
1
+ # The per-flavor `autoload` lines live in `relaton.rb`, not `relaton/db`.
2
+ # `index_name_for`/`pubid_class_for` resolve `Relaton::<Flavor>::INDEXFILE`, so
3
+ # without the umbrella every `--pubid-flavor` fails with "no relaton flavor".
4
+ # Declaring autoloads is cheap: no flavor is loaded until it is referenced.
5
+ require "relaton"
6
+ require "relaton/db"
7
+
8
+ module Relaton
9
+ module Cli
10
+ end
11
+ end
12
+
13
+ require_relative "relaton/bibcollection"
14
+ require_relative "relaton/bibdata"
15
+ require_relative "relaton/element_finder"
16
+ require_relative "relaton/cli/yaml_convertor"
17
+ require_relative "relaton/cli"
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "relaton/render/version"
4
+ require "relaton/render/iso690"
5
+
6
+ module Relaton
7
+ module Render
8
+ # A bibliographic item whose style template resolves to nothing: the
9
+ # single-item API raises, the batch API skips
10
+ class Unrenderable < StandardError; end
11
+
12
+ end
13
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: relaton
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.6
4
+ version: 3.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-11-02 00:00:00.000000000 Z
11
+ date: 2026-11-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: addressable
@@ -318,6 +318,76 @@ dependencies:
318
318
  - - "~>"
319
319
  - !ruby/object:Gem::Version
320
320
  version: 0.3.2
321
+ - !ruby/object:Gem::Dependency
322
+ name: htmlentities
323
+ requirement: !ruby/object:Gem::Requirement
324
+ requirements:
325
+ - - ">="
326
+ - !ruby/object:Gem::Version
327
+ version: '0'
328
+ type: :runtime
329
+ prerelease: false
330
+ version_requirements: !ruby/object:Gem::Requirement
331
+ requirements:
332
+ - - ">="
333
+ - !ruby/object:Gem::Version
334
+ version: '0'
335
+ - !ruby/object:Gem::Dependency
336
+ name: twitter_cldr
337
+ requirement: !ruby/object:Gem::Requirement
338
+ requirements:
339
+ - - ">="
340
+ - !ruby/object:Gem::Version
341
+ version: '0'
342
+ type: :runtime
343
+ prerelease: false
344
+ version_requirements: !ruby/object:Gem::Requirement
345
+ requirements:
346
+ - - ">="
347
+ - !ruby/object:Gem::Version
348
+ version: '0'
349
+ - !ruby/object:Gem::Dependency
350
+ name: liquid
351
+ requirement: !ruby/object:Gem::Requirement
352
+ requirements:
353
+ - - "~>"
354
+ - !ruby/object:Gem::Version
355
+ version: '5'
356
+ type: :runtime
357
+ prerelease: false
358
+ version_requirements: !ruby/object:Gem::Requirement
359
+ requirements:
360
+ - - "~>"
361
+ - !ruby/object:Gem::Version
362
+ version: '5'
363
+ - !ruby/object:Gem::Dependency
364
+ name: thor
365
+ requirement: !ruby/object:Gem::Requirement
366
+ requirements:
367
+ - - ">="
368
+ - !ruby/object:Gem::Version
369
+ version: '0'
370
+ type: :runtime
371
+ prerelease: false
372
+ version_requirements: !ruby/object:Gem::Requirement
373
+ requirements:
374
+ - - ">="
375
+ - !ruby/object:Gem::Version
376
+ version: '0'
377
+ - !ruby/object:Gem::Dependency
378
+ name: thor-hollaback
379
+ requirement: !ruby/object:Gem::Requirement
380
+ requirements:
381
+ - - ">="
382
+ - !ruby/object:Gem::Version
383
+ version: '0'
384
+ type: :runtime
385
+ prerelease: false
386
+ version_requirements: !ruby/object:Gem::Requirement
387
+ requirements:
388
+ - - ">="
389
+ - !ruby/object:Gem::Version
390
+ version: '0'
321
391
  - !ruby/object:Gem::Dependency
322
392
  name: mechanize
323
393
  requirement: !ruby/object:Gem::Requirement
@@ -408,28 +478,28 @@ dependencies:
408
478
  requirements:
409
479
  - - "~>"
410
480
  - !ruby/object:Gem::Version
411
- version: 1.3.121
481
+ version: 1.3.129
412
482
  type: :runtime
413
483
  prerelease: false
414
484
  version_requirements: !ruby/object:Gem::Requirement
415
485
  requirements:
416
486
  - - "~>"
417
487
  - !ruby/object:Gem::Version
418
- version: 1.3.121
488
+ version: 1.3.129
419
489
  - !ruby/object:Gem::Dependency
420
490
  name: pubid
421
491
  requirement: !ruby/object:Gem::Requirement
422
492
  requirements:
423
493
  - - "~>"
424
494
  - !ruby/object:Gem::Version
425
- version: 2.0.4
495
+ version: 2.0.5
426
496
  type: :runtime
427
497
  prerelease: false
428
498
  version_requirements: !ruby/object:Gem::Requirement
429
499
  requirements:
430
500
  - - "~>"
431
501
  - !ruby/object:Gem::Version
432
- version: 2.0.4
502
+ version: 2.0.5
433
503
  - !ruby/object:Gem::Dependency
434
504
  name: yeptris
435
505
  requirement: !ruby/object:Gem::Requirement
@@ -444,20 +514,6 @@ dependencies:
444
514
  - - "~>"
445
515
  - !ruby/object:Gem::Version
446
516
  version: 0.6.51
447
- - !ruby/object:Gem::Dependency
448
- name: relaton-render
449
- requirement: !ruby/object:Gem::Requirement
450
- requirements:
451
- - - "~>"
452
- - !ruby/object:Gem::Version
453
- version: '3.0'
454
- type: :runtime
455
- prerelease: false
456
- version_requirements: !ruby/object:Gem::Requirement
457
- requirements:
458
- - - "~>"
459
- - !ruby/object:Gem::Version
460
- version: '3.0'
461
517
  - !ruby/object:Gem::Dependency
462
518
  name: rfcxml
463
519
  requirement: !ruby/object:Gem::Requirement
@@ -511,17 +567,21 @@ description: |
511
567
  The CLI (relaton-cli) is a separate gem.
512
568
  email:
513
569
  - open.source@ribose.com
514
- executables: []
570
+ executables:
571
+ - relaton
515
572
  extensions: []
516
573
  extra_rdoc_files: []
517
574
  files:
518
575
  - LICENSE
519
576
  - README.adoc
520
577
  - bin/console
578
+ - bin/relaton
521
579
  - bin/rspec
522
580
  - bin/setup
523
581
  - data/equivalence/adoption-chains.yaml
582
+ - lib/relaton-cli.rb
524
583
  - lib/relaton-core.rb
584
+ - lib/relaton-render.rb
525
585
  - lib/relaton.rb
526
586
  - lib/relaton/3gpp.rb
527
587
  - lib/relaton/3gpp/CLAUDE.md
@@ -630,6 +690,8 @@ files:
630
690
  - lib/relaton/bib/sanitizer.rb
631
691
  - lib/relaton/bib/util.rb
632
692
  - lib/relaton/bib/versions.json
693
+ - lib/relaton/bibcollection.rb
694
+ - lib/relaton/bibdata.rb
633
695
  - lib/relaton/bipm.rb
634
696
  - lib/relaton/bipm/CLAUDE.md
635
697
  - lib/relaton/bipm/README.adoc
@@ -737,6 +799,60 @@ files:
737
799
  - lib/relaton/cie/processor.rb
738
800
  - lib/relaton/cie/scrapper.rb
739
801
  - lib/relaton/cie/util.rb
802
+ - lib/relaton/cli.rb
803
+ - lib/relaton/cli/base_convertor.rb
804
+ - lib/relaton/cli/command.rb
805
+ - lib/relaton/cli/data_fetcher.rb
806
+ - lib/relaton/cli/frontend/dist/404.html
807
+ - lib/relaton/cli/frontend/dist/app.iife.js
808
+ - lib/relaton/cli/frontend/dist/style.css
809
+ - lib/relaton/cli/frontend/index.html
810
+ - lib/relaton/cli/frontend/package-lock.json
811
+ - lib/relaton/cli/frontend/package.json
812
+ - lib/relaton/cli/frontend/public/404.html
813
+ - lib/relaton/cli/frontend/src/App.test.ts
814
+ - lib/relaton/cli/frontend/src/App.vue
815
+ - lib/relaton/cli/frontend/src/app.ts
816
+ - lib/relaton/cli/frontend/src/components/DocumentDetail.test.ts
817
+ - lib/relaton/cli/frontend/src/components/DocumentDetail.vue
818
+ - lib/relaton/cli/frontend/src/components/DocumentRow.vue
819
+ - lib/relaton/cli/frontend/src/components/Icon.test.ts
820
+ - lib/relaton/cli/frontend/src/components/Icon.vue
821
+ - lib/relaton/cli/frontend/src/components/Pagination.vue
822
+ - lib/relaton/cli/frontend/src/dev/main.ts
823
+ - lib/relaton/cli/frontend/src/dev/sample-data.json
824
+ - lib/relaton/cli/frontend/src/lib/filter.test.ts
825
+ - lib/relaton/cli/frontend/src/lib/filter.ts
826
+ - lib/relaton/cli/frontend/src/lib/hydrate.test.ts
827
+ - lib/relaton/cli/frontend/src/lib/hydrate.ts
828
+ - lib/relaton/cli/frontend/src/lib/shards.test.ts
829
+ - lib/relaton/cli/frontend/src/lib/shards.ts
830
+ - lib/relaton/cli/frontend/src/lib/types.ts
831
+ - lib/relaton/cli/frontend/src/lib/url.test.ts
832
+ - lib/relaton/cli/frontend/src/lib/url.ts
833
+ - lib/relaton/cli/frontend/src/shims-vue.d.ts
834
+ - lib/relaton/cli/frontend/src/styles/index.css
835
+ - lib/relaton/cli/frontend/src/test/fetch.ts
836
+ - lib/relaton/cli/frontend/tsconfig.json
837
+ - lib/relaton/cli/frontend/vite.config.ts
838
+ - lib/relaton/cli/frontend/vitest.config.ts
839
+ - lib/relaton/cli/frontend_assets.rb
840
+ - lib/relaton/cli/full_text_search.rb
841
+ - lib/relaton/cli/i18n.yaml
842
+ - lib/relaton/cli/index_item_normalizer.rb
843
+ - lib/relaton/cli/index_site_generator.rb
844
+ - lib/relaton/cli/relaton_file.rb
845
+ - lib/relaton/cli/subcommand_collection.rb
846
+ - lib/relaton/cli/subcommand_db.rb
847
+ - lib/relaton/cli/templates/_document.liquid
848
+ - lib/relaton/cli/templates/_index.liquid
849
+ - lib/relaton/cli/templates/index-style.css
850
+ - lib/relaton/cli/templates/index/page.liquid
851
+ - lib/relaton/cli/util.rb
852
+ - lib/relaton/cli/version.rb
853
+ - lib/relaton/cli/xml_convertor.rb
854
+ - lib/relaton/cli/xml_to_html_renderer.rb
855
+ - lib/relaton/cli/yaml_convertor.rb
740
856
  - lib/relaton/cloud.rb
741
857
  - lib/relaton/core.rb
742
858
  - lib/relaton/core/CLAUDE.md
@@ -799,6 +915,7 @@ files:
799
915
  - lib/relaton/ecma/processor.rb
800
916
  - lib/relaton/ecma/standard_parser.rb
801
917
  - lib/relaton/ecma/util.rb
918
+ - lib/relaton/element_finder.rb
802
919
  - lib/relaton/equivalence.rb
803
920
  - lib/relaton/etsi.rb
804
921
  - lib/relaton/etsi/CLAUDE.md
@@ -1223,6 +1340,60 @@ files:
1223
1340
  - lib/relaton/plateau/processor.rb
1224
1341
  - lib/relaton/plateau/technical_report_parser.rb
1225
1342
  - lib/relaton/plateau/util.rb
1343
+ - lib/relaton/render/general.rb
1344
+ - lib/relaton/render/iso690.rb
1345
+ - lib/relaton/render/iso690/csl_import.rb
1346
+ - lib/relaton/render/iso690/element.rb
1347
+ - lib/relaton/render/iso690/elements.rb
1348
+ - lib/relaton/render/iso690/elements/access.rb
1349
+ - lib/relaton/render/iso690/elements/authorizer.rb
1350
+ - lib/relaton/render/iso690/elements/citeid.rb
1351
+ - lib/relaton/render/iso690/elements/component_part.rb
1352
+ - lib/relaton/render/iso690/elements/creator.rb
1353
+ - lib/relaton/render/iso690/elements/edition.rb
1354
+ - lib/relaton/render/iso690/elements/extent.rb
1355
+ - lib/relaton/render/iso690/elements/identifier.rb
1356
+ - lib/relaton/render/iso690/elements/location.rb
1357
+ - lib/relaton/render/iso690/elements/medium.rb
1358
+ - lib/relaton/render/iso690/elements/numeration.rb
1359
+ - lib/relaton/render/iso690/elements/production.rb
1360
+ - lib/relaton/render/iso690/elements/pub_date.rb
1361
+ - lib/relaton/render/iso690/elements/series.rb
1362
+ - lib/relaton/render/iso690/elements/size.rb
1363
+ - lib/relaton/render/iso690/elements/status.rb
1364
+ - lib/relaton/render/iso690/elements/stddoc.rb
1365
+ - lib/relaton/render/iso690/elements/title.rb
1366
+ - lib/relaton/render/iso690/elements/updated.rb
1367
+ - lib/relaton/render/iso690/fields.rb
1368
+ - lib/relaton/render/iso690/i18n.rb
1369
+ - lib/relaton/render/iso690/i18n/en.yml
1370
+ - lib/relaton/render/iso690/i18n/fr.yml
1371
+ - lib/relaton/render/iso690/i18n/ja.yml
1372
+ - lib/relaton/render/iso690/identifier_kinds.rb
1373
+ - lib/relaton/render/iso690/index_renderer.rb
1374
+ - lib/relaton/render/iso690/kinds.rb
1375
+ - lib/relaton/render/iso690/renderer.rb
1376
+ - lib/relaton/render/iso690/rules.rb
1377
+ - lib/relaton/render/iso690/rules/bipm.rb
1378
+ - lib/relaton/render/iso690/rules/jis.rb
1379
+ - lib/relaton/render/iso690/rules/nist.rb
1380
+ - lib/relaton/render/iso690/style.rb
1381
+ - lib/relaton/render/iso690/style/locale.rb
1382
+ - lib/relaton/render/iso690/style/name_form.rb
1383
+ - lib/relaton/render/iso690/style/scheme.rb
1384
+ - lib/relaton/render/iso690/style/sort_rule.rb
1385
+ - lib/relaton/render/iso690/style/template_map.rb
1386
+ - lib/relaton/render/iso690/style/type_template.rb
1387
+ - lib/relaton/render/iso690/styles/apa.yml
1388
+ - lib/relaton/render/iso690/styles/author-date.yml
1389
+ - lib/relaton/render/iso690/styles/chicago.yml
1390
+ - lib/relaton/render/iso690/styles/ieee-sa.yml
1391
+ - lib/relaton/render/iso690/styles/jis-en.yml
1392
+ - lib/relaton/render/iso690/styles/jis-ja.yml
1393
+ - lib/relaton/render/iso690/styles/lncs.yml
1394
+ - lib/relaton/render/iso690/styles/mla.yml
1395
+ - lib/relaton/render/iso690/template.rb
1396
+ - lib/relaton/render/version.rb
1226
1397
  - lib/relaton/sdo.rb
1227
1398
  - lib/relaton/sdo/CLAUDE.md
1228
1399
  - lib/relaton/sdo/config.rb