metanorma 1.0.2 → 1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5afd8795a47a00890fd05c762db66dfdb4803e8a3e7279b5c25fc579094a4824
4
- data.tar.gz: 21af01a41736b2c7b8a521d9489323c3a4ef2273670546acd898d9820445eaf0
3
+ metadata.gz: 315077d28cfe3e052808e9890d2f3c3f571b7350788e6d6423be1746e5559ef4
4
+ data.tar.gz: f8a9c7d3055af8a687fe8df52b725b1fadbceb8920bef8ea449af5cde0aafb6a
5
5
  SHA512:
6
- metadata.gz: 0715b1527df4e4e3169f176c9301a1c6cec2fe0a72a46c61613d45addc11186d81a8f2400c65aa395e01721870f94e081706a935480d5e87c638e10f484afd70
7
- data.tar.gz: d47bdf3f165768070fd249fa7f1bbb5e6f65305c345f4848ba7dd03820ae1729f3dde273986cd5d5e03c1f218f73da444387b19705399d50805b300d43991829
6
+ metadata.gz: ab023b366ca20c7d4fe3785e00698d2ccd868c0d119b0df74a5ba52e11f4bd69b884b18fea2b820838708c3bae5516be911c9e82de8302b6ade8cf52c99c36b4
7
+ data.tar.gz: 3f3520b67f58296be755b0e8b2b9cfb0e98611e214f73e131e1eccde7b74dfd611db1f476cee84d5071f6ef0c1b7b801ed9874e7261697b52fb7bf288282c57d
@@ -6,15 +6,23 @@ on:
6
6
  push:
7
7
  branches: [ master ]
8
8
  pull_request:
9
+ paths-ignore:
10
+ - .github/workflows/ubuntu.yml
11
+ - .github/workflows/windows.yml
9
12
 
10
13
  jobs:
11
14
  test-macos:
12
15
  name: Test on Ruby ${{ matrix.ruby }} macOS
13
16
  runs-on: macos-latest
17
+ continue-on-error: ${{ matrix.experimental }}
14
18
  strategy:
15
19
  fail-fast: false
16
20
  matrix:
17
21
  ruby: [ '2.6', '2.5', '2.4' ]
22
+ experimental: [false]
23
+ include:
24
+ - ruby: '2.7'
25
+ experimental: true
18
26
  steps:
19
27
  - uses: actions/checkout@master
20
28
  - name: Use Ruby
@@ -29,10 +37,10 @@ jobs:
29
37
  - name: Use Node
30
38
  uses: actions/setup-node@v1
31
39
  with:
32
- node-version: '8'
40
+ node-version: '12'
33
41
  - name: Install Puppeteer
34
42
  run: |
35
- npm install -g puppeteer
43
+ npm install -g puppeteer@3.0.1
36
44
  - name: Run specs
37
45
  run: |
38
46
  bundle exec rake
@@ -6,15 +6,23 @@ on:
6
6
  push:
7
7
  branches: [ master ]
8
8
  pull_request:
9
+ paths-ignore:
10
+ - .github/workflows/macos.yml
11
+ - .github/workflows/windows.yml
9
12
 
10
13
  jobs:
11
14
  test-linux:
12
15
  name: Test on Ruby ${{ matrix.ruby }} Ubuntu
13
16
  runs-on: ubuntu-latest
17
+ continue-on-error: ${{ matrix.experimental }}
14
18
  strategy:
15
19
  fail-fast: false
16
20
  matrix:
17
21
  ruby: [ '2.6', '2.5', '2.4' ]
22
+ experimental: [false]
23
+ include:
24
+ - ruby: '2.7'
25
+ experimental: true
18
26
  steps:
19
27
  - uses: actions/checkout@master
20
28
  - name: Use Ruby
@@ -29,15 +37,17 @@ jobs:
29
37
  - name: Use Node
30
38
  uses: actions/setup-node@v1
31
39
  with:
32
- node-version: '8'
40
+ node-version: '12'
33
41
  - name: Install Puppeteer
34
42
  run: |
35
- npm install -g puppeteer
43
+ sudo apt-get update
44
+ sudo apt-get install libgbm1
45
+ npm install -g puppeteer@3.0.1
36
46
  - name: Run specs
37
47
  run: |
38
48
  bundle exec rake
39
49
  - name: Trigger dependent repositories
40
- if: github.ref == 'refs/heads/master'
50
+ if: github.ref == 'refs/heads/master' && matrix.ruby == '2.6'
41
51
  env:
42
52
  GH_USERNAME: ${{ secrets.PAT_USERNAME }}
43
53
  GH_ACCESS_TOKEN: ${{ secrets.PAT_TOKEN }}
@@ -6,15 +6,23 @@ on:
6
6
  push:
7
7
  branches: [ master ]
8
8
  pull_request:
9
+ paths-ignore:
10
+ - .github/workflows/macos.yml
11
+ - .github/workflows/ubuntu.yml
9
12
 
10
13
  jobs:
11
14
  test-windows:
12
15
  name: Test on Ruby ${{ matrix.ruby }} Windows
13
16
  runs-on: windows-latest
17
+ continue-on-error: ${{ matrix.experimental }}
14
18
  strategy:
15
19
  fail-fast: false
16
20
  matrix:
17
21
  ruby: [ '2.6', '2.5', '2.4' ]
22
+ experimental: [false]
23
+ include:
24
+ - ruby: '2.7'
25
+ experimental: true
18
26
  steps:
19
27
  - uses: actions/checkout@master
20
28
  - name: Use Ruby
@@ -31,10 +39,10 @@ jobs:
31
39
  - name: Use Node
32
40
  uses: actions/setup-node@v1
33
41
  with:
34
- node-version: '8'
42
+ node-version: '12'
35
43
  - name: Install Puppeteer
36
44
  run: |
37
- npm install -g puppeteer
45
+ npm install -g puppeteer@3.0.1
38
46
  - name: Run specs
39
47
  run: |
40
48
  bundle exec rake
data/.gitignore CHANGED
@@ -16,3 +16,6 @@
16
16
 
17
17
  # rspec failure tracking
18
18
  .rspec_status
19
+ .rubocop-https---raw-githubusercontent-com-riboseinc-oss-guides-master-ci-rubocop-yml
20
+ Gemfile.lock
21
+ relaton/
@@ -4,14 +4,18 @@ require "htmlentities"
4
4
 
5
5
  module Metanorma
6
6
  class Compile
7
+ # @return [Array<String>]
8
+ attr_reader :errors
9
+
7
10
  def initialize
8
11
  @registry = Metanorma::Registry.instance
12
+ @errors = []
9
13
  end
10
14
 
11
15
  def compile(filename, options = {})
16
+ require_libraries(options)
12
17
  options = options_extract(filename, options)
13
18
  validate(options) or return nil
14
- require_libraries(options)
15
19
  @processor = @registry.find_processor(options[:type].to_sym)
16
20
  extensions = get_extensions(options) or return nil
17
21
  (file, isodoc = process_input(filename, options)) or return nil
@@ -89,21 +93,29 @@ module Metanorma
89
93
  end
90
94
 
91
95
  def get_extensions(options)
92
- options[:extension_keys] ||= @processor.output_formats.inject([]) do |memo, (k, _)|
93
- memo << k; memo
96
+ options[:extension_keys] ||= @processor.output_formats.reduce([]) do |memo, (k, _)|
97
+ memo << k
94
98
  end
95
- extensions = options[:extension_keys].inject([]) do |memo, e|
96
- @processor.output_formats[e] and memo << e or
97
- Util.log("[metanorma] Error: #{e} format is not supported for this standard.", :error)
98
- memo
99
+ extensions = options[:extension_keys].reduce([]) do |memo, e|
100
+ if @processor.output_formats[e]
101
+ memo << e
102
+ else
103
+ message = "[metanorma] Error: #{e} format is not supported for this standard."
104
+ @errors << message
105
+ Util.log(message, :error)
106
+ memo
107
+ end
99
108
  end
109
+ if !extensions.include?(:presentation) and extensions.any? { |e| @processor.use_presentation_xml(e) }
110
+ extensions << :presentation
111
+ end
100
112
  extensions
101
113
  end
102
114
 
103
115
  def process_input(filename, options)
104
116
  case extname = File.extname(filename)
105
117
  when ".adoc"
106
- Util.log("[metanorma] Processing: Asciidoctor input.", :info)
118
+ Util.log("[metanorma] Processing: AsciiDoc input.", :info)
107
119
  file = read_file(filename)
108
120
  options[:asciimath] and
109
121
  file.sub!(/^(=[^\n]+\n)/, "\\1:mn-keep-asciimath:\n")
@@ -195,24 +207,51 @@ module Metanorma
195
207
  end
196
208
  end
197
209
 
210
+ # dependency ordering
211
+ def sort_extensions_execution(ext)
212
+ case ext
213
+ when :xml then 0
214
+ when :rxl then 1
215
+ when :presentation then 2
216
+ else
217
+ 99
218
+ end
219
+ end
220
+
221
+ def wrap_html(options, file_extension, outfilename)
222
+ if options[:wrapper] and /html$/.match file_extension
223
+ outfilename = outfilename.sub(/\.html$/, "")
224
+ FileUtils.mkdir_p outfilename
225
+ FileUtils.mv "#{outfilename}.html", outfilename
226
+ FileUtils.mv "#{outfilename}_images", outfilename, force: true
227
+ end
228
+ end
229
+
230
+ # isodoc is Raw Metanorma XML
198
231
  def process_extensions(extensions, file, isodoc, options)
199
- extensions.each do |ext|
200
- isodoc_options = @processor.extract_options(file)
201
- isodoc_options[:datauriimage] = true if options[:datauriimage]
232
+ xml_name = options[:filename].sub(/\.[^.]+$/, ".xml")
233
+ presentationxml_name = options[:filename].sub(/\.[^.]+$/, ".presentation.xml")
234
+ isodoc_options = @processor.extract_options(file)
235
+ isodoc_options[:datauriimage] = true if options[:datauriimage]
236
+ extensions.sort do |a, b|
237
+ sort_extensions_execution(a) <=> sort_extensions_execution(b)
238
+ end.each do |ext|
202
239
  file_extension = @processor.output_formats[ext]
203
240
  outfilename = options[:filename].sub(/\.[^.]+$/, ".#{file_extension}")
204
241
  if ext == :rxl
205
242
  options[:relaton] = outfilename
206
243
  relaton_export(isodoc, options)
207
244
  else
208
- @processor.output(isodoc, outfilename, ext, isodoc_options)
209
- end
210
- if options[:wrapper] and /html$/.match file_extension
211
- outfilename = outfilename.sub(/\.html$/, "")
212
- FileUtils.mkdir_p outfilename
213
- FileUtils.mv "#{outfilename}.html", outfilename
214
- FileUtils.mv "#{outfilename}_images", outfilename, force: true
245
+ begin
246
+ #require "byebug"; byebug
247
+ @processor.use_presentation_xml(ext) ?
248
+ @processor.output(nil, presentationxml_name, outfilename, ext, isodoc_options) :
249
+ @processor.output(isodoc, xml_name, outfilename, ext, isodoc_options)
250
+ rescue StandardError => e
251
+ puts e.message
252
+ end
215
253
  end
254
+ wrap_html(options, file_extension, outfilename)
216
255
  end
217
256
  end
218
257
  end
@@ -34,6 +34,10 @@ module Metanorma
34
34
  }.reject { |_, val| val.nil? }
35
35
  end
36
36
 
37
+ def empty_attr(attr, name)
38
+ attr&.sub(/^#{name}:\s*$/, "#{name}: true")&.sub(/^#{name}:\s+/, "")
39
+ end
40
+
37
41
  def extract_options(file)
38
42
  headerextract = file.sub(/\n\n.*$/m, "\n")
39
43
 
@@ -58,8 +62,16 @@ module Metanorma
58
62
  /\n:data-uri-image: (?<datauriimage>[^\n]+)\n/ =~ headerextract
59
63
  /\n:htmltoclevels: (?<htmltoclevels>[^\n]+)\n/ =~ headerextract
60
64
  /\n:doctoclevels: (?<doctoclevels>[^\n]+)\n/ =~ headerextract
61
- /\n:hierarchical-assets: (?<hierarchical_assets>[^\n]+)\n/ =~ headerextract
62
- /\n:use-xinclude: (?<use_xinclude>[^\n]+)\n/ =~ headerextract
65
+ /\n:(?<hierarchical_assets>hierarchical-assets:[^\n]*)\n/ =~ headerextract
66
+ /\n:(?<use_xinclude>use-xinclude:[^\n]*)\n/ =~ headerextract
67
+ /\n:(?<break_up_urls_in_tables>break-up-urls-in-tables:[^\n]*)\n/ =~ headerextract
68
+
69
+ defined?(hierarchical_assets) and
70
+ hierarchical_assets = empty_attr(hierarchical_assets, "hierarchical-assets")
71
+ defined?(use_xinclude) and
72
+ use_xinclude = empty_attr(use_xinclude, "use-xinclude")
73
+ defined?(break_up_urls_in_tables) and
74
+ break_up_urls_in_tables = empty_attr(break_up_urls_in_tables, "break-up-urls-in-tables")
63
75
  {
64
76
  script: defined?(script) ? script : nil,
65
77
  bodyfont: defined?(bodyfont) ? bodyfont : nil,
@@ -84,6 +96,7 @@ module Metanorma
84
96
  doctoclevels: defined?(doctoclevels) ? doctoclevels : nil,
85
97
  hierarchical_assets: defined?(hierarchical_assets) ? hierarchical_assets : nil,
86
98
  use_xinclude: defined?(use_xinclude) ? use_xinclude : nil,
99
+ break_up_urls_in_tables: defined?(break_up_urls_in_tables) ? break_up_urls_in_tables : nil,
87
100
  }.reject { |_, val| val.nil? }
88
101
  end
89
102
 
@@ -1,5 +1,6 @@
1
1
  require_relative "./output/base"
2
2
  require_relative "./output/pdf"
3
+ require_relative "./output/xslfo"
3
4
 
4
5
  module Metanorma
5
6
  module Output
@@ -1,4 +1,5 @@
1
1
  require "open3"
2
+ require_relative "./utils.rb"
2
3
  require "pathname"
3
4
  require "shellwords"
4
5
 
@@ -7,9 +8,7 @@ module Metanorma
7
8
  class Pdf < Base
8
9
 
9
10
  def convert(url_path, output_path)
10
- file_url = url_path
11
- file_url = "file://#{url_path}" if Pathname.new(file_url).absolute?
12
- file_url = "file://#{Dir.pwd}/#{url_path}" unless %r{^file://} =~ file_url
11
+ file_url = Utils::file_path(url_path)
13
12
  pdfjs = File.join(File.dirname(__FILE__), "../../../bin/metanorma-pdf.js")
14
13
 
15
14
  node_path = ENV["NODE_PATH"] || `npm root --quiet -g`.strip
@@ -0,0 +1,16 @@
1
+ require "pathname"
2
+
3
+ module Metanorma
4
+ module Output
5
+ module Utils
6
+ class << self
7
+ def file_path(url_path)
8
+ file_url = url_path
9
+ file_url = "file://#{url_path}" if Pathname.new(file_url).absolute?
10
+ file_url = "file://#{Dir.pwd}/#{url_path}" unless %r{^file://} =~ file_url
11
+ file_url
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,15 @@
1
+ require 'mn2pdf'
2
+ require_relative "./utils.rb"
3
+
4
+ module Metanorma
5
+ module Output
6
+ class XslfoPdf < Base
7
+ def convert(url_path, output_path, xsl_stylesheet)
8
+ return if url_path.nil? || output_path.nil? || xsl_stylesheet.nil?
9
+
10
+ Mn2pdf.convert(url_path, output_path, xsl_stylesheet)
11
+ end
12
+ end
13
+ end
14
+ end
15
+
@@ -15,6 +15,7 @@ module Metanorma
15
15
  def output_formats
16
16
  {
17
17
  xml: "xml",
18
+ presentation: "presentation.xml",
18
19
  rxl: "rxl"
19
20
  }
20
21
  end
@@ -23,7 +24,15 @@ module Metanorma
23
24
  raise "This is an abstract class!"
24
25
  end
25
26
 
26
- def output(isodoc_node, outname, format, options={})
27
+ def use_presentation_xml(ext)
28
+ case ext
29
+ when :html, :doc, :pdf then true
30
+ else
31
+ false
32
+ end
33
+ end
34
+
35
+ def output(isodoc_node, inname, outname, format, options={})
27
36
  File.open(outname, "w:UTF-8") { |f| f.write(isodoc_node) }
28
37
  end
29
38
 
@@ -48,7 +48,7 @@ module Metanorma
48
48
  @processors.inject({}) do |acc, (k,v)|
49
49
  if v.asciidoctor_backend
50
50
  x = Asciidoctor.load nil, {backend: v.asciidoctor_backend}
51
- acc[k] = x.converter.class::XML_ROOT_TAG
51
+ acc[k] = x.converter.xml_root_tag
52
52
  end
53
53
  acc
54
54
  end
@@ -1,3 +1,3 @@
1
1
  module Metanorma
2
- VERSION = "1.0.2"
2
+ VERSION = "1.1.0"
3
3
  end
@@ -26,11 +26,12 @@ Gem::Specification.new do |spec|
26
26
  spec.add_runtime_dependency 'asciidoctor'
27
27
  spec.add_runtime_dependency 'htmlentities'
28
28
  spec.add_runtime_dependency 'nokogiri'
29
+ spec.add_runtime_dependency 'mn2pdf', "~> 1"
29
30
 
30
31
  spec.add_development_dependency "rake", "~> 12.0"
31
32
  spec.add_development_dependency "rspec", "~> 3.0"
32
33
  spec.add_development_dependency "byebug", "~> 10.0"
33
34
  spec.add_development_dependency "rspec-command", "~> 1.0"
34
35
  spec.add_development_dependency "equivalent-xml", "~> 0.6"
35
- spec.add_development_dependency "metanorma-iso", "~> 1.3"
36
+ spec.add_development_dependency "metanorma-iso", "~> 1.4"
36
37
  end
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.0.2
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-04-17 00:00:00.000000000 Z
11
+ date: 2020-06-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: asciidoctor
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: mn2pdf
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: rake
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -128,14 +142,14 @@ dependencies:
128
142
  requirements:
129
143
  - - "~>"
130
144
  - !ruby/object:Gem::Version
131
- version: '1.3'
145
+ version: '1.4'
132
146
  type: :development
133
147
  prerelease: false
134
148
  version_requirements: !ruby/object:Gem::Requirement
135
149
  requirements:
136
150
  - - "~>"
137
151
  - !ruby/object:Gem::Version
138
- version: '1.3'
152
+ version: '1.4'
139
153
  description: Library to process any Metanorma standard.
140
154
  email:
141
155
  - open.source@ribose.com
@@ -177,6 +191,8 @@ files:
177
191
  - lib/metanorma/output.rb
178
192
  - lib/metanorma/output/base.rb
179
193
  - lib/metanorma/output/pdf.rb
194
+ - lib/metanorma/output/utils.rb
195
+ - lib/metanorma/output/xslfo.rb
180
196
  - lib/metanorma/processor.rb
181
197
  - lib/metanorma/registry.rb
182
198
  - lib/metanorma/util.rb
@@ -186,7 +202,7 @@ homepage: https://github.com/metanorma/metanorma
186
202
  licenses:
187
203
  - BSD-2-Clause
188
204
  metadata: {}
189
- post_install_message:
205
+ post_install_message:
190
206
  rdoc_options: []
191
207
  require_paths:
192
208
  - lib
@@ -201,9 +217,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
201
217
  - !ruby/object:Gem::Version
202
218
  version: '0'
203
219
  requirements: []
204
- rubyforge_project:
205
- rubygems_version: 2.7.6
206
- signing_key:
220
+ rubygems_version: 3.0.3
221
+ signing_key:
207
222
  specification_version: 4
208
223
  summary: Metanorma is the standard of standards; the metanorma gem allows you to create
209
224
  any standard document type supported by Metanorma.