metanorma 1.7.6 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +5 -1
  3. data/lib/metanorma/array_monkeypatch.rb +9 -0
  4. data/lib/metanorma/asciidoctor_extensions/glob_include_processor.rb +13 -11
  5. data/lib/metanorma/collection/collection.rb +225 -0
  6. data/lib/metanorma/collection/config/bibdata.rb +12 -0
  7. data/lib/metanorma/collection/config/compile_options.rb +13 -0
  8. data/lib/metanorma/collection/config/config.rb +163 -0
  9. data/lib/metanorma/collection/config/converters.rb +30 -0
  10. data/lib/metanorma/collection/config/directive.rb +10 -0
  11. data/lib/metanorma/collection/config/manifest.rb +88 -0
  12. data/lib/metanorma/collection/document/document.rb +133 -0
  13. data/lib/metanorma/collection/filelookup/filelookup.rb +250 -0
  14. data/lib/metanorma/collection/filelookup/filelookup_sectionsplit.rb +87 -0
  15. data/lib/metanorma/collection/manifest/manifest.rb +237 -0
  16. data/lib/metanorma/collection/renderer/fileparse.rb +247 -0
  17. data/lib/metanorma/collection/renderer/fileprocess.rb +173 -0
  18. data/lib/metanorma/collection/renderer/navigation.rb +133 -0
  19. data/lib/metanorma/collection/renderer/render_word.rb +133 -0
  20. data/lib/metanorma/collection/renderer/renderer.rb +157 -0
  21. data/lib/metanorma/collection/renderer/utils.rb +183 -0
  22. data/lib/metanorma/collection/sectionsplit/sectionsplit.rb +218 -0
  23. data/lib/metanorma/collection/util/disambig_files.rb +37 -0
  24. data/lib/metanorma/collection/util/util.rb +72 -0
  25. data/lib/metanorma/collection/xrefprocess/xrefprocess.rb +222 -0
  26. data/lib/metanorma/{compile.rb → compile/compile.rb} +17 -11
  27. data/lib/metanorma/{compile_options.rb → compile/compile_options.rb} +9 -5
  28. data/lib/metanorma/{compile_validate.rb → compile/compile_validate.rb} +1 -1
  29. data/lib/metanorma/{extract.rb → compile/extract.rb} +2 -2
  30. data/lib/metanorma/{config.rb → config/config.rb} +1 -1
  31. data/lib/metanorma/input/asciidoc.rb +3 -3
  32. data/lib/metanorma/input/base.rb +1 -5
  33. data/lib/metanorma/processor/processor.rb +54 -0
  34. data/lib/metanorma/processor.rb +1 -49
  35. data/lib/metanorma/{registry.rb → registry/registry.rb} +0 -1
  36. data/lib/metanorma/shale_monkeypatch.rb +15 -0
  37. data/lib/metanorma/util/fontist_helper.rb +130 -0
  38. data/lib/metanorma/util/util.rb +45 -0
  39. data/lib/metanorma/util/worker_pool.rb +39 -0
  40. data/lib/metanorma/version.rb +1 -1
  41. data/lib/metanorma.rb +13 -8
  42. data/metanorma.gemspec +2 -1
  43. metadata +51 -26
  44. data/Gemfile.devel +0 -2
  45. data/lib/metanorma/collection.rb +0 -243
  46. data/lib/metanorma/collection_fileparse.rb +0 -254
  47. data/lib/metanorma/collection_fileprocess.rb +0 -157
  48. data/lib/metanorma/collection_manifest.rb +0 -139
  49. data/lib/metanorma/collection_render_utils.rb +0 -169
  50. data/lib/metanorma/collection_render_word.rb +0 -131
  51. data/lib/metanorma/collection_renderer.rb +0 -230
  52. data/lib/metanorma/document.rb +0 -133
  53. data/lib/metanorma/files_lookup.rb +0 -208
  54. data/lib/metanorma/files_lookup_sectionsplit.rb +0 -84
  55. data/lib/metanorma/fontist_utils.rb +0 -122
  56. data/lib/metanorma/sectionsplit.rb +0 -216
  57. data/lib/metanorma/sectionsplit_links.rb +0 -189
  58. data/lib/metanorma/util.rb +0 -127
  59. data/lib/metanorma/worker_pool.rb +0 -29
@@ -0,0 +1,45 @@
1
+ module Metanorma
2
+ module Util
3
+ class << self
4
+ def log(message, type = :info)
5
+ log_types = Metanorma.configuration.logs.map(&:to_s) || []
6
+
7
+ if log_types.include?(type.to_s)
8
+ puts(message)
9
+ end
10
+
11
+ if type == :fatal
12
+ exit(1)
13
+ end
14
+ end
15
+
16
+ # dependency ordering
17
+ def sort_extensions_execution_ord(ext)
18
+ case ext
19
+ when :xml then 0
20
+ when :rxl then 1
21
+ when :presentation then 2
22
+ else
23
+ 99
24
+ end
25
+ end
26
+
27
+ def sort_extensions_execution(ext)
28
+ ext.sort do |a, b|
29
+ sort_extensions_execution_ord(a) <=> sort_extensions_execution_ord(b)
30
+ end
31
+ end
32
+
33
+ def recursive_string_keys(hash)
34
+ case hash
35
+ when Hash then hash.map do |k, v|
36
+ [k.to_s, recursive_string_keys(v)]
37
+ end.to_h
38
+ when Enumerable then hash.map { |v| recursive_string_keys(v) }
39
+ else
40
+ hash
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,39 @@
1
+ module Metanorma
2
+ module Util
3
+ class WorkersPool
4
+ def initialize(workers)
5
+ init_vars(workers)
6
+ @threads = Array.new(@workers) do
7
+ init_thread
8
+ end
9
+ end
10
+
11
+ def init_vars(workers)
12
+ @workers = workers
13
+ @queue = SizedQueue.new(@workers)
14
+ end
15
+
16
+ def init_thread
17
+ Thread.new do
18
+ catch(:exit) do
19
+ loop do
20
+ job, args = @queue.pop
21
+ job.call *args
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ def schedule(*args, &block)
28
+ @queue << [block, args]
29
+ end
30
+
31
+ def shutdown
32
+ @workers.times do
33
+ schedule { throw :exit }
34
+ end
35
+ @threads.map(&:join)
36
+ end
37
+ end
38
+ end
39
+ end
@@ -1,3 +1,3 @@
1
1
  module Metanorma
2
- VERSION = "1.7.6".freeze
2
+ VERSION = "2.0.0".freeze
3
3
  end
data/lib/metanorma.rb CHANGED
@@ -1,17 +1,22 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ class Array
4
+ alias orig_filter filter
5
+ end
6
+
3
7
  require "metanorma/version"
4
8
  require "asciidoctor"
5
- require "metanorma/util"
6
- require "metanorma/config"
9
+ require "metanorma/util/util"
10
+ require "metanorma/config/config"
7
11
  require "metanorma/input"
8
- require "metanorma/registry"
9
- require "metanorma/processor"
12
+ require "metanorma/registry/registry"
13
+ require "metanorma/processor/processor"
10
14
  require "metanorma/asciidoctor_extensions"
11
- require "metanorma/compile"
12
- require "metanorma/collection"
13
- require "metanorma/collection_renderer"
14
- require "metanorma/document"
15
+ require "metanorma/compile/compile"
16
+ require "metanorma/collection/collection"
17
+ require "metanorma/collection/manifest/manifest"
18
+ require "metanorma/collection/renderer/renderer"
19
+ require "metanorma/collection/document/document"
15
20
  require "vectory"
16
21
 
17
22
  # Metanorma module
data/metanorma.gemspec CHANGED
@@ -29,7 +29,7 @@ Gem::Specification.new do |spec|
29
29
  spec.add_runtime_dependency "isodoc", ">= 2.6.3"
30
30
  spec.add_runtime_dependency "mn2pdf", "~> 1"
31
31
  spec.add_runtime_dependency "nokogiri"
32
- spec.add_runtime_dependency "pry"
32
+ spec.add_runtime_dependency "shale"
33
33
 
34
34
  # get relaton-cli to avoid circular reference with metanorma-standoc
35
35
  # spec.add_dependency "relaton-cli"
@@ -39,6 +39,7 @@ Gem::Specification.new do |spec|
39
39
  spec.add_development_dependency "equivalent-xml", "~> 0.6"
40
40
  spec.add_development_dependency "metanorma-iso"
41
41
  spec.add_development_dependency "mnconvert"
42
+ spec.add_development_dependency "pry"
42
43
  spec.add_development_dependency "rake", "~> 13.0"
43
44
  spec.add_development_dependency "rspec", "~> 3.0"
44
45
  spec.add_development_dependency "rspec-command", "~> 1.0"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: metanorma
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.6
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-04-22 00:00:00.000000000 Z
11
+ date: 2024-06-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: asciidoctor
@@ -95,7 +95,7 @@ dependencies:
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
- name: pry
98
+ name: shale
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - ">="
@@ -164,6 +164,20 @@ dependencies:
164
164
  - - ">="
165
165
  - !ruby/object:Gem::Version
166
166
  version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: pry
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
167
181
  - !ruby/object:Gem::Dependency
168
182
  name: rake
169
183
  requirement: !ruby/object:Gem::Requirement
@@ -265,38 +279,49 @@ files:
265
279
  - CHANGELOG.adoc
266
280
  - CODE_OF_CONDUCT.md
267
281
  - Gemfile
268
- - Gemfile.devel
269
282
  - LICENSE.txt
270
283
  - README.adoc
271
284
  - lib/metanorma.rb
285
+ - lib/metanorma/array_monkeypatch.rb
272
286
  - lib/metanorma/asciidoctor_extensions.rb
273
287
  - lib/metanorma/asciidoctor_extensions/glob_include_processor.rb
274
- - lib/metanorma/collection.rb
275
- - lib/metanorma/collection_fileparse.rb
276
- - lib/metanorma/collection_fileprocess.rb
277
- - lib/metanorma/collection_manifest.rb
278
- - lib/metanorma/collection_render_utils.rb
279
- - lib/metanorma/collection_render_word.rb
280
- - lib/metanorma/collection_renderer.rb
281
- - lib/metanorma/compile.rb
282
- - lib/metanorma/compile_options.rb
283
- - lib/metanorma/compile_validate.rb
284
- - lib/metanorma/config.rb
285
- - lib/metanorma/document.rb
286
- - lib/metanorma/extract.rb
287
- - lib/metanorma/files_lookup.rb
288
- - lib/metanorma/files_lookup_sectionsplit.rb
289
- - lib/metanorma/fontist_utils.rb
288
+ - lib/metanorma/collection/collection.rb
289
+ - lib/metanorma/collection/config/bibdata.rb
290
+ - lib/metanorma/collection/config/compile_options.rb
291
+ - lib/metanorma/collection/config/config.rb
292
+ - lib/metanorma/collection/config/converters.rb
293
+ - lib/metanorma/collection/config/directive.rb
294
+ - lib/metanorma/collection/config/manifest.rb
295
+ - lib/metanorma/collection/document/document.rb
296
+ - lib/metanorma/collection/filelookup/filelookup.rb
297
+ - lib/metanorma/collection/filelookup/filelookup_sectionsplit.rb
298
+ - lib/metanorma/collection/manifest/manifest.rb
299
+ - lib/metanorma/collection/renderer/fileparse.rb
300
+ - lib/metanorma/collection/renderer/fileprocess.rb
301
+ - lib/metanorma/collection/renderer/navigation.rb
302
+ - lib/metanorma/collection/renderer/render_word.rb
303
+ - lib/metanorma/collection/renderer/renderer.rb
304
+ - lib/metanorma/collection/renderer/utils.rb
305
+ - lib/metanorma/collection/sectionsplit/sectionsplit.rb
306
+ - lib/metanorma/collection/util/disambig_files.rb
307
+ - lib/metanorma/collection/util/util.rb
308
+ - lib/metanorma/collection/xrefprocess/xrefprocess.rb
309
+ - lib/metanorma/compile/compile.rb
310
+ - lib/metanorma/compile/compile_options.rb
311
+ - lib/metanorma/compile/compile_validate.rb
312
+ - lib/metanorma/compile/extract.rb
313
+ - lib/metanorma/config/config.rb
290
314
  - lib/metanorma/input.rb
291
315
  - lib/metanorma/input/asciidoc.rb
292
316
  - lib/metanorma/input/base.rb
293
317
  - lib/metanorma/processor.rb
294
- - lib/metanorma/registry.rb
295
- - lib/metanorma/sectionsplit.rb
296
- - lib/metanorma/sectionsplit_links.rb
297
- - lib/metanorma/util.rb
318
+ - lib/metanorma/processor/processor.rb
319
+ - lib/metanorma/registry/registry.rb
320
+ - lib/metanorma/shale_monkeypatch.rb
321
+ - lib/metanorma/util/fontist_helper.rb
322
+ - lib/metanorma/util/util.rb
323
+ - lib/metanorma/util/worker_pool.rb
298
324
  - lib/metanorma/version.rb
299
- - lib/metanorma/worker_pool.rb
300
325
  - metanorma.gemspec
301
326
  homepage: https://github.com/metanorma/metanorma
302
327
  licenses:
@@ -317,7 +342,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
317
342
  - !ruby/object:Gem::Version
318
343
  version: '0'
319
344
  requirements: []
320
- rubygems_version: 3.3.26
345
+ rubygems_version: 3.3.27
321
346
  signing_key:
322
347
  specification_version: 4
323
348
  summary: Metanorma is the standard of standards; the metanorma gem allows you to create
data/Gemfile.devel DELETED
@@ -1,2 +0,0 @@
1
- gem "metanorma-cli"
2
- gem "isodoc", git: "https://github.com/metanorma/isodoc", branch: "main"
@@ -1,243 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "relaton"
4
- require "relaton/cli"
5
- require "metanorma/collection_manifest"
6
- require "metanorma-utils"
7
- require_relative "util"
8
-
9
- module Metanorma
10
- # Metanorma collection of documents
11
- class Collection
12
- attr_reader :file
13
-
14
- # @return [Array<String>] documents-inline to inject the XML into
15
- # the collection manifest; documents-external to keeps them outside
16
- attr_accessor :directives, :documents, :bibdatas, :coverpage, :dirname
17
- attr_accessor :disambig, :manifest
18
-
19
- # @param file [String] path to source file
20
- # @param dirname [String] directory of source file
21
- # @param directives [Array<String>] documents-inline to inject the XML into
22
- # the collection manifest; documents-external to keeps them outside
23
- # @param bibdata [RelatonBib::BibliographicItem]
24
- # @param manifest [Metanorma::CollectionManifest]
25
- # @param documents [Hash<String, Metanorma::Document>]
26
- # @param prefatory [String]
27
- # @param coverpage [String]
28
- # @param final [String]
29
- # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
30
- def initialize(**args)
31
- @file = args[:file]
32
- @dirname = File.dirname(@file)
33
- @directives = args[:directives] || []
34
- @bibdata = args[:bibdata]
35
- @manifest = args[:manifest]
36
- @manifest.collection = self
37
- @coverpage = Util::hash_key_detect(@directives, "coverpage", @coverpage)
38
- @coverpage_style = Util::hash_key_detect(@directives, "coverpage-style",
39
- @coverpage_style)
40
- @documents = args[:documents] || {}
41
- @bibdatas = args[:documents] || {}
42
- if @documents.any? && !@directives.include?("documents-inline")
43
- @directives << "documents-inline"
44
- end
45
- @documents.merge! @manifest.documents(@dirname)
46
- @bibdatas.merge! @manifest.documents(@dirname)
47
- @documents.transform_keys { |k| Util::key(k) }
48
- @bibdatas.transform_keys { |k| Util::key(k) }
49
- @prefatory = args[:prefatory]
50
- @final = args[:final]
51
- @compile = Metanorma::Compile.new
52
- @log = Metanorma::Utils::Log.new
53
- @disambig = Util::DisambigFiles.new
54
- end
55
-
56
- # rubocop:enable Metrics/AbcSize,Metrics/MethodLength
57
- def clean_exit
58
- @log.write(File.join(@dirname,
59
- "#{File.basename(@file, '.*')}.err.html"))
60
- end
61
-
62
- # @return [String] XML
63
- def to_xml
64
- b = Nokogiri::XML::Builder.new do |xml|
65
- xml.send(:"metanorma-collection",
66
- "xmlns" => "http://metanorma.org") do |mc|
67
- collection_body(mc)
68
- end
69
- end
70
- b.to_xml
71
- end
72
-
73
- def collection_body(coll)
74
- coll << @bibdata.to_xml(bibdata: true, date_format: :full)
75
- @directives.each do |d|
76
- coll << "<directives>#{obj_to_xml(d)}</directives>"
77
- end
78
- @manifest.to_xml coll
79
- content_to_xml "prefatory", coll
80
- doccontainer coll
81
- content_to_xml "final", coll
82
- end
83
-
84
- def obj_to_xml(elem)
85
- case elem
86
- when ::Array
87
- elem.each_with_object([]) do |v, m|
88
- m << "<value>#{obj_to_xml(v)}</value>"
89
- end.join
90
- when ::Hash
91
- elem.each_with_object([]) do |(k, v), m|
92
- m << "<#{k}>#{obj_to_xml(v)}</#{k}>"
93
- end.join
94
- else elem end
95
- end
96
-
97
- def render(opts)
98
- CollectionRenderer.render self, opts.merge(log: @log)
99
- clean_exit
100
- end
101
-
102
- class << self
103
- # @param file [String]
104
- # @return [RelatonBib::BibliographicItem,
105
- # RelatonIso::IsoBibliographicItem]
106
- def parse(file)
107
- case file
108
- when /\.xml$/ then parse_xml(file)
109
- when /.ya?ml$/ then parse_yaml(file)
110
- end
111
- end
112
-
113
- private
114
-
115
- def parse_xml(file)
116
- xml = Nokogiri::XML(File.read(file, encoding: "UTF-8"), &:huge)
117
- (b = xml.at("/xmlns:metanorma-collection/xmlns:bibdata")) and
118
- bd = Relaton::Cli.parse_xml(b)
119
- mnf_xml = xml.at("/xmlns:metanorma-collection/xmlns:manifest")
120
- mnf = CollectionManifest.from_xml mnf_xml
121
- pref = pref_final_content xml.at("//xmlns:prefatory-content")
122
- fnl = pref_final_content xml.at("//xmlns:final-content")
123
- cov = pref_final_content xml.at("//xmlns:coverpage")
124
- new(file: file, bibdata: bd, manifest: mnf,
125
- directives: directives_from_xml(xml.xpath("//xmlns:directives")),
126
- documents: docs_from_xml(xml, mnf),
127
- bibdatas: docs_from_xml(xml, mnf),
128
- prefatory: pref, final: fnl, coverpage: cov)
129
- end
130
-
131
- # TODO refine
132
- def directives_from_xml(dir)
133
- dir.each_with_object([]) do |d, m|
134
- m << if d.at("./xmlns:value")
135
- x.xpath("./xmlns:value").map(&:text)
136
- elsif d.at("./*")
137
- d.elements.each_with_object({}) do |e, ret|
138
- ret[e.name] = e.children.to_xml
139
- end
140
- else d.children.to_xml
141
- end
142
- end
143
- end
144
-
145
- def parse_yaml(file)
146
- yaml = YAML.load_file file
147
- if yaml["bibdata"]
148
- bd = Relaton::Cli::YAMLConvertor.convert_single_file yaml["bibdata"]
149
- end
150
- mnf = CollectionManifest.from_yaml yaml["manifest"]
151
- dirs = yaml["directives"]
152
- pref = yaml["prefatory-content"]
153
- fnl = yaml["final-content"]
154
- new(file: file, directives: dirs, bibdata: bd, manifest: mnf,
155
- prefatory: pref, final: fnl)
156
- end
157
-
158
- # @param xml [Nokogiri::XML::Document]
159
- # @parma mnf [Metanorma::CollectionManifest]
160
- # @return [Hash{String=>Metanorma::Document}]
161
- def docs_from_xml(xml, mnf)
162
- xml.xpath("//xmlns:doc-container//xmlns:bibdata")
163
- .each_with_object({}) do |b, m|
164
- bd = Relaton::Cli.parse_xml b
165
- docref = mnf.docref_by_id bd.docidentifier.first.id
166
- m[docref["identifier"]] = Document.new bd, docref["fileref"]
167
- m
168
- end
169
- end
170
-
171
- # @param xml [Nokogiri::XML::Element, nil]
172
- # @return [String, nil]
173
- def pref_final_content(xml)
174
- xml or return
175
- <<~CONT
176
-
177
- == #{xml.at('title')&.text}
178
- #{xml.at('p')&.text}
179
- CONT
180
- end
181
- end
182
-
183
- private
184
-
185
- # @return [String, nil]
186
- attr_reader :prefatory, :final
187
-
188
- # @return [String]
189
- def dummy_header
190
- <<~DUMMY
191
- = X
192
- A
193
-
194
- DUMMY
195
- end
196
-
197
- # @param elm [String] 'prefatory' or 'final'
198
- # @param builder [Nokogiri::XML::Builder]
199
- def content_to_xml(elm, builder)
200
- return unless (cnt = send(elm))
201
-
202
- @compile.load_flavor(doctype)
203
- out = sections(dummy_header + cnt.strip)
204
- builder.send("#{elm}-content") { |b| b << out }
205
- end
206
-
207
- # @param cnt [String] prefatory/final content
208
- # @return [String] XML
209
- def sections(cnt)
210
- c = Asciidoctor.convert(cnt, backend: doctype.to_sym, header_footer: true)
211
- Nokogiri::XML(c, &:huge).at("//xmlns:sections").children.to_xml
212
- end
213
-
214
- # @param builder [Nokogiri::XML::Builder]
215
- def doccontainer(builder)
216
- Array(@directives).include? "documents-inline" or return
217
- documents.each_with_index do |(_, d), i|
218
- doccontainer1(builder, d, i)
219
- end
220
- end
221
-
222
- def doccontainer1(builder, doc, idx)
223
- id = format("doc%<index>09d", index: idx)
224
- builder.send(:"doc-container", id: id) do |b|
225
- if doc.attachment
226
- doc.bibitem and b << doc.bibitem.root.to_xml
227
- b.attachment Vectory::Utils::datauri(doc.file)
228
- else doc.to_xml b
229
- end
230
- end
231
- end
232
-
233
- def doctype
234
- @doctype ||= fetch_doctype || "standoc"
235
- end
236
-
237
- def fetch_doctype
238
- docid = @bibdata.docidentifier.first
239
- docid or return
240
- docid.type&.downcase || docid.id&.sub(/\s.*$/, "")&.downcase
241
- end
242
- end
243
- end