metanorma 1.3.1 → 1.3.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/rake.yml +2 -12
- data/.hound.yml +3 -1
- data/.rubocop.yml +4 -8
- data/Gemfile +2 -2
- data/Rakefile +1 -1
- data/lib/metanorma/asciidoctor_extensions/glob_include_processor.rb +4 -6
- data/lib/metanorma/collection.rb +39 -18
- data/lib/metanorma/collection_fileparse.rb +88 -63
- data/lib/metanorma/collection_fileprocess.rb +118 -35
- data/lib/metanorma/collection_manifest.rb +33 -13
- data/lib/metanorma/collection_renderer.rb +43 -14
- data/lib/metanorma/compile.rb +42 -37
- data/lib/metanorma/compile_validate.rb +34 -28
- data/lib/metanorma/config.rb +1 -1
- data/lib/metanorma/document.rb +28 -12
- data/lib/metanorma/input.rb +0 -1
- data/lib/metanorma/input/asciidoc.rb +27 -30
- data/lib/metanorma/output.rb +0 -2
- data/lib/metanorma/output/utils.rb +2 -1
- data/lib/metanorma/util.rb +45 -0
- data/lib/metanorma/version.rb +1 -1
- data/metanorma.gemspec +2 -2
- metadata +5 -5
@@ -1,45 +1,51 @@
|
|
1
1
|
module Metanorma
|
2
2
|
class Compile
|
3
|
+
def validate_options(options)
|
4
|
+
validate_type(options)
|
5
|
+
validate_format(options)
|
6
|
+
end
|
7
|
+
|
3
8
|
def validate_type(options)
|
4
9
|
unless options[:type]
|
5
10
|
Util.log("[metanorma] Error: Please specify a standard type: "\
|
6
|
-
"#{@registry.supported_backends}.", :
|
7
|
-
return nil
|
11
|
+
"#{@registry.supported_backends}.", :fatal)
|
8
12
|
end
|
9
13
|
stdtype = options[:type].to_sym
|
10
|
-
|
14
|
+
load_flavor(stdtype)
|
15
|
+
end
|
16
|
+
|
17
|
+
def validate_format(options)
|
18
|
+
unless options[:format] == :asciidoc
|
19
|
+
Util.log("[metanorma] Error: Only source file format currently "\
|
20
|
+
"supported is 'asciidoc'.", :fatal)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def load_flavor(stdtype)
|
27
|
+
flavor = "metanorma-#{stdtype}"
|
11
28
|
unless @registry.supported_backends.include? stdtype
|
12
|
-
Util.log("[metanorma] Info: Loading `#{
|
29
|
+
Util.log("[metanorma] Info: Loading `#{flavor}` gem "\
|
13
30
|
"for standard type `#{stdtype}`.", :info)
|
14
31
|
end
|
15
|
-
|
16
|
-
require "metanorma-#{stdtype}"
|
17
|
-
Util.log("[metanorma] Info: gem `#{metanorma_flavor}` loaded.", :info)
|
18
|
-
rescue Gem::ConflictError
|
19
|
-
Util.log("[metanorma] Error: Couldn't resolve dependencies for "\
|
20
|
-
"`metanorma-#{stdtype}`, Please add it to your Gemfile "\
|
21
|
-
"and run bundle install first", :error)
|
22
|
-
return false
|
23
|
-
rescue LoadError
|
24
|
-
Util.log("[metanorma] Error: loading gem `#{metanorma_flavor}` "\
|
25
|
-
"failed. Exiting.", :error)
|
26
|
-
return false
|
27
|
-
end
|
32
|
+
require_flavor(flavor, stdtype)
|
28
33
|
unless @registry.supported_backends.include? stdtype
|
29
|
-
Util.log("[metanorma] Error: The `#{
|
30
|
-
"still doesn't support `#{stdtype}`. Exiting.", :
|
31
|
-
return false
|
34
|
+
Util.log("[metanorma] Error: The `#{flavor}` gem "\
|
35
|
+
"still doesn't support `#{stdtype}`. Exiting.", :fatal)
|
32
36
|
end
|
33
|
-
true
|
34
37
|
end
|
35
38
|
|
36
|
-
def
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
39
|
+
def require_flavor(flavor, stdtype)
|
40
|
+
require flavor
|
41
|
+
Util.log("[metanorma] Info: gem `#{flavor}` loaded.", :info)
|
42
|
+
rescue Gem::ConflictError
|
43
|
+
Util.log("[metanorma] Error: Couldn't resolve dependencies for "\
|
44
|
+
"`metanorma-#{stdtype}`, Please add it to your Gemfile "\
|
45
|
+
"and run bundle install first", :fatal)
|
46
|
+
rescue LoadError
|
47
|
+
Util.log("[metanorma] Error: loading gem `#{flavor}` "\
|
48
|
+
"failed. Exiting.", :fatal)
|
43
49
|
end
|
44
50
|
end
|
45
51
|
end
|
data/lib/metanorma/config.rb
CHANGED
data/lib/metanorma/document.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Metanorma
|
2
2
|
class Document
|
3
3
|
# @return [Strin]
|
4
|
-
attr_reader :file, :attachment
|
4
|
+
attr_reader :file, :attachment, :bibitem
|
5
5
|
|
6
6
|
# @param bibitem [RelatonBib::BibliographicItem]
|
7
7
|
def initialize(bibitem, file, options = {})
|
@@ -14,9 +14,12 @@ module Metanorma
|
|
14
14
|
class << self
|
15
15
|
# @param file [String] file path
|
16
16
|
# @param attachment [Bool] is an attachment
|
17
|
+
# @param identifier [String] is the identifier assigned the file
|
18
|
+
# in the collection file
|
17
19
|
# @return [Metanorma::Document]
|
18
|
-
def parse_file(file, attachment)
|
19
|
-
new
|
20
|
+
def parse_file(file, attachment, identifier = nil)
|
21
|
+
new(bibitem(file, attachment, identifier), file,
|
22
|
+
{ attachment: attachment })
|
20
23
|
end
|
21
24
|
|
22
25
|
# #param xml [Nokogiri::XML::Document, Nokogiri::XML::Element]
|
@@ -27,10 +30,18 @@ module Metanorma
|
|
27
30
|
|
28
31
|
# raw XML file, can be used to put in entire file instead of just bibitem
|
29
32
|
def raw_file(filename)
|
30
|
-
doc = Nokogiri::XML(File.read(filename, encoding: "UTF-8"))
|
33
|
+
doc = Nokogiri::XML(File.read(filename, encoding: "UTF-8")) do |config|
|
34
|
+
config.huge
|
35
|
+
end
|
31
36
|
new(doc, filename, raw: true)
|
32
37
|
end
|
33
38
|
|
39
|
+
def attachment_bibitem(identifier)
|
40
|
+
Nokogiri::XML(
|
41
|
+
"<bibdata><docidentifier>#{identifier}</docidentifier></bibdata>",
|
42
|
+
)
|
43
|
+
end
|
44
|
+
|
34
45
|
private
|
35
46
|
|
36
47
|
# #param xml [Nokogiri::XML::Document, Nokogiri::XML::Element]
|
@@ -51,13 +62,16 @@ module Metanorma
|
|
51
62
|
# @param file [String]
|
52
63
|
# @return [RelatonBib::BibliographicItem,
|
53
64
|
# RelatonIso::IsoBibliographicItem]
|
54
|
-
def bibitem(file)
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
65
|
+
def bibitem(file, attachment, identifier)
|
66
|
+
if attachment then attachment_bibitem(identifier)
|
67
|
+
else
|
68
|
+
case format(file)
|
69
|
+
when :xml
|
70
|
+
from_xml Nokogiri::XML(File.read(file, encoding: "UTF-8"))
|
71
|
+
when :yaml
|
72
|
+
yaml = File.read(file, encoding: "UTF-8")
|
73
|
+
Relaton::Cli::YAMLConvertor.convert_single_file(yaml)
|
74
|
+
end
|
61
75
|
end
|
62
76
|
end
|
63
77
|
end
|
@@ -88,7 +102,9 @@ module Metanorma
|
|
88
102
|
if @raw
|
89
103
|
builder << @bibitem.root.to_xml
|
90
104
|
else
|
91
|
-
builder.send(type
|
105
|
+
builder.send("#{type}-standard") do |b|
|
106
|
+
b << @bibitem.to_xml(bibdata: true)
|
107
|
+
end
|
92
108
|
end
|
93
109
|
end
|
94
110
|
end
|
data/lib/metanorma/input.rb
CHANGED
@@ -2,20 +2,14 @@ require "nokogiri"
|
|
2
2
|
|
3
3
|
module Metanorma
|
4
4
|
module Input
|
5
|
-
|
6
5
|
class Asciidoc < Base
|
7
|
-
|
8
6
|
def process(file, filename, type, options = {})
|
9
7
|
require "asciidoctor"
|
10
8
|
out_opts = {
|
11
|
-
to_file: false,
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
attributes: [
|
16
|
-
"nodoc", "stem", "xrefstyle=short", "docfile=#{filename}",
|
17
|
-
"output_dir=#{options[:output_dir]}"
|
18
|
-
]
|
9
|
+
to_file: false, safe: :safe, backend: type, header_footer: true,
|
10
|
+
attributes: ["nodoc", "stem", "xrefstyle=short",
|
11
|
+
"docfile=#{filename}",
|
12
|
+
"output_dir=#{options[:output_dir]}"]
|
19
13
|
}
|
20
14
|
unless asciidoctor_validate(file, filename, out_opts)
|
21
15
|
warn "Cannot continue compiling Asciidoctor document"
|
@@ -27,11 +21,12 @@ module Metanorma
|
|
27
21
|
def asciidoctor_validate(file, filename, options)
|
28
22
|
err = nil
|
29
23
|
begin
|
30
|
-
previous_stderr
|
24
|
+
previous_stderr = $stderr
|
25
|
+
$stderr = StringIO.new
|
31
26
|
::Asciidoctor.load(file, options)
|
32
|
-
%r{(\n|^)asciidoctor: ERROR: ['"]?#{Regexp.escape(filename ||
|
33
|
-
"<empty>")}['"]?: line \d+: include file not found: }
|
34
|
-
|
27
|
+
%r{(\n|^)asciidoctor: ERROR: ['"]?#{Regexp.escape(filename ||
|
28
|
+
"<empty>")}['"]?: line \d+: include file not found: }
|
29
|
+
.match($stderr.string) and err = $stderr.string
|
35
30
|
ensure
|
36
31
|
$stderr = previous_stderr
|
37
32
|
end
|
@@ -45,8 +40,9 @@ module Metanorma
|
|
45
40
|
/\n:mn-output-extensions: (?<extensions>[^\n]+)\n/ =~ headerextract
|
46
41
|
/\n:mn-relaton-output-file: (?<relaton>[^\n]+)\n/ =~ headerextract
|
47
42
|
/\n(?<asciimath>:mn-keep-asciimath:[^\n]*)\n/ =~ headerextract
|
48
|
-
asciimath = defined?(asciimath)
|
49
|
-
|
43
|
+
asciimath = if defined?(asciimath)
|
44
|
+
(!asciimath.nil? && asciimath != ":mn-keep-asciimath: false")
|
45
|
+
end
|
50
46
|
asciimath = nil if asciimath == false
|
51
47
|
{
|
52
48
|
type: defined?(type) ? type : nil,
|
@@ -60,38 +56,39 @@ module Metanorma
|
|
60
56
|
attr&.sub(/^#{name}:\s*$/, "#{name}: true")&.sub(/^#{name}:\s+/, "")
|
61
57
|
end
|
62
58
|
|
59
|
+
ADOC_OPTIONS = %w(htmlstylesheet htmlcoverpage htmlintropage scripts
|
60
|
+
scripts-override scripts-pdf wordstylesheet bare i18nyaml
|
61
|
+
standardstylesheet header wordcoverpage wordintropage
|
62
|
+
ulstyle olstyle htmlstylesheet-override
|
63
|
+
htmltoclevels doctoclevels sectionsplit
|
64
|
+
body-font header-font monospace-font title-font
|
65
|
+
wordstylesheet-override).freeze
|
66
|
+
|
63
67
|
def extract_options(file)
|
64
68
|
header = file.sub(/\n\n.*$/m, "\n")
|
65
|
-
ret =
|
66
|
-
scripts-pdf wordstylesheet
|
67
|
-
standardstylesheet header wordcoverpage wordintropage i18nyaml
|
68
|
-
ulstyle olstyle htmlstylesheet-override
|
69
|
-
htmltoclevels doctoclevels sectionsplit
|
70
|
-
body-font header-font monospace-font title-font
|
71
|
-
wordstylesheet-override).each_with_object({}) do |w, acc|
|
69
|
+
ret = ADOC_OPTIONS.each_with_object({}) do |w, acc|
|
72
70
|
m = /\n:#{w}: ([^\n]+)\n/.match(header) or next
|
73
71
|
acc[w.gsub(/-/, "").sub(/override$/, "_override")
|
74
72
|
.sub(/pdf$/, "_pdf").to_sym] = m[1]
|
75
73
|
end
|
76
74
|
/\n:data-uri-image: (?<datauriimage>[^\n]+)\n/ =~ header
|
77
|
-
/\n:(?<
|
75
|
+
/\n:(?<hier_assets>hierarchical-assets:[^\n]*)\n/ =~ header
|
78
76
|
/\n:(?<use_xinclude>use-xinclude:[^\n]*)\n/ =~ header
|
79
77
|
/\n:(?<break_up>break-up-urls-in-tables:[^\n]*)\n/ =~ header
|
80
78
|
|
81
|
-
defined?(
|
82
|
-
|
79
|
+
defined?(hier_assets) and
|
80
|
+
hier_assets = empty_attr(hier_assets, "hierarchical-assets")
|
83
81
|
defined?(use_xinclude) and
|
84
82
|
use_xinclude = empty_attr(use_xinclude, "use-xinclude")
|
85
83
|
defined?(break_up) and
|
86
84
|
break_up = empty_attr(break_up, "break-up-urls-in-tables")
|
87
|
-
ret.merge(
|
85
|
+
ret.merge(
|
88
86
|
datauriimage: defined?(datauriimage) ? datauriimage != "false" : nil,
|
89
|
-
hierarchical_assets: defined?(
|
87
|
+
hierarchical_assets: defined?(hier_assets) ? hier_assets : nil,
|
90
88
|
use_xinclude: defined?(use_xinclude) ? use_xinclude : nil,
|
91
89
|
break_up_urls_in_tables: defined?(break_up) ? break_up : nil,
|
92
|
-
|
90
|
+
).reject { |_, val| val.nil? }
|
93
91
|
end
|
94
|
-
|
95
92
|
end
|
96
93
|
end
|
97
94
|
end
|
data/lib/metanorma/output.rb
CHANGED
@@ -7,7 +7,8 @@ module Metanorma
|
|
7
7
|
def file_path(url_path)
|
8
8
|
file_url = url_path
|
9
9
|
file_url = "file://#{url_path}" if Pathname.new(file_url).absolute?
|
10
|
-
|
10
|
+
%r{^file://}.match?(file_url) or
|
11
|
+
file_url = "file://#{Dir.pwd}/#{url_path}"
|
11
12
|
file_url
|
12
13
|
end
|
13
14
|
end
|
data/lib/metanorma/util.rb
CHANGED
@@ -11,5 +11,50 @@ module Metanorma
|
|
11
11
|
exit(1)
|
12
12
|
end
|
13
13
|
end
|
14
|
+
|
15
|
+
# dependency ordering
|
16
|
+
def self.sort_extensions_execution_ord(ext)
|
17
|
+
case ext
|
18
|
+
when :xml then 0
|
19
|
+
when :rxl then 1
|
20
|
+
when :presentation then 2
|
21
|
+
else
|
22
|
+
99
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.sort_extensions_execution(ext)
|
27
|
+
ext.sort do |a, b|
|
28
|
+
sort_extensions_execution_ord(a) <=> sort_extensions_execution_ord(b)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class DisambigFiles
|
33
|
+
def initialize
|
34
|
+
@seen_filenames = []
|
35
|
+
end
|
36
|
+
|
37
|
+
def source2dest_filename(name, disambig = true)
|
38
|
+
n = name.sub(%r{^(\./)?(\.\./)+}, "")
|
39
|
+
dir = File.dirname(n)
|
40
|
+
base = File.basename(n)
|
41
|
+
if disambig && @seen_filenames.include?(base)
|
42
|
+
base = disambiguate_filename(base)
|
43
|
+
end
|
44
|
+
@seen_filenames << base
|
45
|
+
dir == "." ? base : File.join(dir, base)
|
46
|
+
end
|
47
|
+
|
48
|
+
def disambiguate_filename(base)
|
49
|
+
m = /^(?<start>.+\.)(?!0)(?<num>\d+)\.(?<suff>[^.]*)$/.match(base) ||
|
50
|
+
/^(?<start>.+\.)(?<suff>[^.]*)/.match(base) ||
|
51
|
+
/^(?<start>.+)$/.match(base)
|
52
|
+
i = m.names.include?("num") ? m["num"].to_i + 1 : 1
|
53
|
+
while @seen_filenames.include? base = "#{m['start']}#{i}.#{m['suff']}"
|
54
|
+
i += 1
|
55
|
+
end
|
56
|
+
base
|
57
|
+
end
|
58
|
+
end
|
14
59
|
end
|
15
60
|
end
|
data/lib/metanorma/version.rb
CHANGED
data/metanorma.gemspec
CHANGED
@@ -20,10 +20,10 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.bindir = "bin"
|
21
21
|
# spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
22
|
spec.require_paths = ["lib"]
|
23
|
-
spec.required_ruby_version = ">= 2.
|
23
|
+
spec.required_ruby_version = ">= 2.5.0"
|
24
24
|
|
25
25
|
spec.add_runtime_dependency "asciidoctor"
|
26
|
-
spec.add_runtime_dependency "fontist", "~> 1.
|
26
|
+
spec.add_runtime_dependency "fontist", "~> 1.9"
|
27
27
|
spec.add_runtime_dependency "htmlentities"
|
28
28
|
spec.add_runtime_dependency "metanorma-utils", "~> 1.2.0"
|
29
29
|
spec.add_runtime_dependency "mn2pdf", "~> 1"
|
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.3.
|
4
|
+
version: 1.3.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ribose Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-07-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: asciidoctor
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '1.
|
33
|
+
version: '1.9'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '1.
|
40
|
+
version: '1.9'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: htmlentities
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -286,7 +286,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
286
286
|
requirements:
|
287
287
|
- - ">="
|
288
288
|
- !ruby/object:Gem::Version
|
289
|
-
version: 2.
|
289
|
+
version: 2.5.0
|
290
290
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
291
291
|
requirements:
|
292
292
|
- - ">="
|