metanorma-utils 1.4.4.2 → 1.4.6

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: 9e7d4b6d86dedc30058632c7ee8e4ac52f7da75d40ec9f8537410bb2d907ad84
4
- data.tar.gz: e0f0cc16ad9d45ef019beb1bbdffa37c65d01dc5e4a7447b9a0ce919eda0a193
3
+ metadata.gz: 6cb00a5f8e7ff86f9d16128e0c8cb1587c24897b17377ef72238ef53b26a6679
4
+ data.tar.gz: 52620169a6fc3515cd8be7ecc7f6926759382d05f57faa5dd40acf29d8f8c649
5
5
  SHA512:
6
- metadata.gz: 98028f963be5cc7261afe75ce8ebbecc08df32b16c7783e8a94263453941b3139549367f6baa0576a187aafa2007b400fc76d7e6905a249216866aa9c075466b
7
- data.tar.gz: f8e5cb9be34dc02eb56e24c6cd7c3b8e477f89eebdb356d130ad903ce5c12f63fdfcae934ebb859570d01f5ae8b3dda156c96b3e88b290a83540135ef6c1477d
6
+ metadata.gz: 94acee04cfb8fde0caa49de7d0c88e18e6796af8871f0ba3b374b07c1172f86290abf641590fa5c7c3f13c52b3d492c907444142c439b322df8c914cc8a81527
7
+ data.tar.gz: 4c613bf6368276e0472e96f1fd44c55f87e42e1935aaa24482c39ae68cca6861456929ad18afbebc0f3ddedd271d83ed6511cd96df0d3608866cf0e9d8827383
data/lib/utils/main.rb CHANGED
@@ -3,6 +3,7 @@ require "tempfile"
3
3
  require "sterile"
4
4
  require "htmlentities"
5
5
  require "nokogiri"
6
+ require "csv"
6
7
 
7
8
  module Metanorma
8
9
  module Utils
data/lib/utils/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Metanorma
2
2
  module Utils
3
- VERSION = "1.4.4.2".freeze
3
+ VERSION = "1.4.6".freeze
4
4
  end
5
5
  end
data/lib/utils/xml.rb CHANGED
@@ -6,12 +6,19 @@ require "nokogiri"
6
6
 
7
7
  module Metanorma
8
8
  module Utils
9
- NAMECHAR = "\u0000-\u002c\u002f\u003a-\u0040\\u005b-\u005e"\
10
- "\u0060\u007b-\u00b6\u00b8-\u00bf\u00d7\u00f7\u037e"\
11
- "\u2000-\u200b"\
9
+ NAMECHAR = "\u0000-\u002c\u002f\u003a-\u0040\\u005b-\u005e" \
10
+ "\u0060\u007b-\u00b6\u00b8-\u00bf\u00d7\u00f7\u037e" \
11
+ "\u2000-\u200b" \
12
12
  "\u200e-\u203e\u2041-\u206f\u2190-\u2bff\u2ff0-\u3000".freeze
13
- NAMESTARTCHAR = "\\u002d\u002e\u0030-\u0039\u00b7\u0300-\u036f"\
13
+ NAMESTARTCHAR = "\\u002d\u002e\u0030-\u0039\u00b7\u0300-\u036f" \
14
14
  "\u203f-\u2040".freeze
15
+ NOKOHEAD = <<~HERE.freeze
16
+ <!DOCTYPE html SYSTEM
17
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
18
+ <html xmlns="http://www.w3.org/1999/xhtml">
19
+ <head> <title></title> <meta charset="UTF-8" /> </head>
20
+ <body> </body> </html>
21
+ HERE
15
22
 
16
23
  class << self
17
24
  def to_ncname(tag, asciionly: true)
@@ -31,14 +38,6 @@ module Metanorma
31
38
  node.nil? || node.id.nil? || node.id.empty? ? "_#{uuid}" : node.id
32
39
  end
33
40
 
34
- NOKOHEAD = <<~HERE.freeze
35
- <!DOCTYPE html SYSTEM
36
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
37
- <html xmlns="http://www.w3.org/1999/xhtml">
38
- <head> <title></title> <meta charset="UTF-8" /> </head>
39
- <body> </body> </html>
40
- HERE
41
-
42
41
  # block for processing XML document fragments as XHTML,
43
42
  # to allow for HTMLentities
44
43
  # Unescape special chars used in Asciidoctor substitution processing
@@ -55,12 +54,38 @@ module Metanorma
55
54
  end
56
55
  end
57
56
 
57
+ def noko_html(&block)
58
+ doc = ::Nokogiri::XML.parse(NOKOHEAD)
59
+ fragment = doc.fragment("")
60
+ ::Nokogiri::XML::Builder.with fragment, &block
61
+ fragment.to_xml(encoding: "US-ASCII", indent: 0,
62
+ save_with: Nokogiri::XML::Node::SaveOptions::AS_XML)
63
+ .lines.map do |l|
64
+ l.gsub(/\s*\n/, "")
65
+ end
66
+ end
67
+
68
+ def to_xhtml_fragment(xml)
69
+ doc = ::Nokogiri::XML.parse(NOKOHEAD)
70
+ doc.fragment(xml)
71
+ end
72
+
58
73
  def ns(xpath)
59
74
  xpath.gsub(%r{/([a-zA-z])}, "/xmlns:\\1")
60
75
  .gsub(%r{::([a-zA-z])}, "::xmlns:\\1")
61
76
  .gsub(%r{\[([a-zA-z][a-z0-9A-Z@/-]* ?=)}, "[xmlns:\\1")
62
77
  .gsub(%r{\[([a-zA-z][a-z0-9A-Z@/-]*[/\[\]])}, "[xmlns:\\1")
63
78
  end
79
+
80
+ def numeric_escapes(xml)
81
+ c = HTMLEntities.new
82
+ xml.split(/(&[^ \r\n\t#;]+;)/).map do |t|
83
+ if /^(&[^ \t\r\n#;]+;)/.match?(t)
84
+ c.encode(c.decode(t), :hexadecimal)
85
+ else t
86
+ end
87
+ end.join
88
+ end
64
89
  end
65
90
  end
66
91
  end
@@ -20,12 +20,16 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.bindir = "bin"
22
22
  spec.require_paths = ["lib"]
23
- spec.files = `git ls-files`.split("\n")
23
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
24
+ f.match(%r{^(test|spec|features|bin|.github)/}) \
25
+ || f.match(%r{Rakefile|bin/rspec})
26
+ end
24
27
  spec.test_files = `git ls-files -- {spec}/*`.split("\n")
25
- spec.required_ruby_version = Gem::Requirement.new(">= 2.5.0")
28
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.7.0")
26
29
 
27
30
  spec.add_dependency "asciidoctor", ">= 2"
28
31
  spec.add_dependency "concurrent-ruby"
32
+ spec.add_dependency "csv"
29
33
  spec.add_dependency "htmlentities", "~> 4.3.4"
30
34
  spec.add_dependency "marcel", "~> 1.0.0"
31
35
  spec.add_dependency "mime-types"
@@ -37,7 +41,6 @@ Gem::Specification.new do |spec|
37
41
  spec.add_development_dependency "equivalent-xml", "~> 0.6"
38
42
  spec.add_development_dependency "guard", "~> 2.14"
39
43
  spec.add_development_dependency "guard-rspec", "~> 4.7"
40
- spec.add_development_dependency "metanorma-standoc", "~> 2.0"
41
44
  spec.add_development_dependency "rake", "~> 13.0"
42
45
  spec.add_development_dependency "rspec", "~> 3.6"
43
46
  spec.add_development_dependency "rubocop", "~> 1.5.2"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: metanorma-utils
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.4.2
4
+ version: 1.4.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: 2022-09-25 00:00:00.000000000 Z
11
+ date: 2023-01-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: asciidoctor
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: csv
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: htmlentities
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -178,20 +192,6 @@ dependencies:
178
192
  - - "~>"
179
193
  - !ruby/object:Gem::Version
180
194
  version: '4.7'
181
- - !ruby/object:Gem::Dependency
182
- name: metanorma-standoc
183
- requirement: !ruby/object:Gem::Requirement
184
- requirements:
185
- - - "~>"
186
- - !ruby/object:Gem::Version
187
- version: '2.0'
188
- type: :development
189
- prerelease: false
190
- version_requirements: !ruby/object:Gem::Requirement
191
- requirements:
192
- - - "~>"
193
- - !ruby/object:Gem::Version
194
- version: '2.0'
195
195
  - !ruby/object:Gem::Dependency
196
196
  name: rake
197
197
  requirement: !ruby/object:Gem::Requirement
@@ -299,16 +299,12 @@ executables: []
299
299
  extensions: []
300
300
  extra_rdoc_files: []
301
301
  files:
302
- - ".github/workflows/rake.yml"
303
- - ".github/workflows/release.yml"
304
302
  - ".gitignore"
305
303
  - ".hound.yml"
306
304
  - ".rubocop.yml"
307
305
  - Gemfile
308
306
  - LICENSE
309
307
  - README.adoc
310
- - Rakefile
311
- - bin/rspec
312
308
  - lib/metanorma-utils.rb
313
309
  - lib/utils/hash_transform_keys.rb
314
310
  - lib/utils/image.rb
@@ -317,13 +313,6 @@ files:
317
313
  - lib/utils/version.rb
318
314
  - lib/utils/xml.rb
319
315
  - metanorma-utils.gemspec
320
- - spec/fixtures/action_schemaexpg1.svg
321
- - spec/fixtures/rice_image1.png
322
- - spec/hash_transform_keys_spec.rb
323
- - spec/img_spec.rb
324
- - spec/spec_helper.rb
325
- - spec/utils_spec.rb
326
- - spec/xml_spec.rb
327
316
  homepage: https://github.com/metanorma/metanorma-utils
328
317
  licenses:
329
318
  - BSD-2-Clause
@@ -336,14 +325,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
336
325
  requirements:
337
326
  - - ">="
338
327
  - !ruby/object:Gem::Version
339
- version: 2.5.0
328
+ version: 2.7.0
340
329
  required_rubygems_version: !ruby/object:Gem::Requirement
341
330
  requirements:
342
331
  - - ">="
343
332
  - !ruby/object:Gem::Version
344
333
  version: '0'
345
334
  requirements: []
346
- rubygems_version: 3.1.6
335
+ rubygems_version: 3.3.26
347
336
  signing_key:
348
337
  specification_version: 4
349
338
  summary: metanorma-utils
@@ -1,15 +0,0 @@
1
- # Auto-generated by Cimas: Do not edit it manually!
2
- # See https://github.com/metanorma/cimas
3
- name: rake
4
-
5
- on:
6
- push:
7
- branches: [ master, main ]
8
- tags: [ v* ]
9
- pull_request:
10
-
11
- jobs:
12
- rake:
13
- uses: metanorma/ci/.github/workflows/generic-rake.yml@main
14
- secrets:
15
- pat_token: ${{ secrets.METANORMA_CI_PAT_TOKEN }}
@@ -1,24 +0,0 @@
1
- # Auto-generated by Cimas: Do not edit it manually!
2
- # See https://github.com/metanorma/cimas
3
- name: release
4
-
5
- on:
6
- workflow_dispatch:
7
- inputs:
8
- next_version:
9
- description: |
10
- Next release version. Possible values: x.y.z, major, minor, patch or pre|rc|etc
11
- required: true
12
- default: 'skip'
13
- push:
14
- tags: [ v* ]
15
-
16
- jobs:
17
- release:
18
- uses: metanorma/ci/.github/workflows/rubygems-release.yml@main
19
- with:
20
- next_version: ${{ github.event.inputs.next_version }}
21
- secrets:
22
- rubygems-api-key: ${{ secrets.METANORMA_CI_RUBYGEMS_API_KEY }}
23
- pat_token: ${{ secrets.METANORMA_CI_PAT_TOKEN }}
24
-
data/Rakefile DELETED
@@ -1,6 +0,0 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
3
-
4
- RSpec::Core::RakeTask.new(:spec)
5
-
6
- task default: :spec
data/bin/rspec DELETED
@@ -1,17 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- # This file was generated by Bundler.
4
- #
5
- # The application 'rspec' is installed as part of a gem, and
6
- # this file is here to facilitate running it.
7
- #
8
-
9
- require "pathname"
10
- ENV["BUNDLE_GEMFILE"] ||= File.expand_path(
11
- "../../Gemfile", Pathname.new(__FILE__).realpath
12
- )
13
-
14
- require "rubygems"
15
- require "bundler/setup"
16
-
17
- load Gem.bin_path("rspec-core", "rspec")
@@ -1,124 +0,0 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <!-- Generator: Adobe Illustrator 25.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
- <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
4
- viewBox="0 0 595.28 841.89" style="enable-background:new 0 0 595.28 841.89;" xml:space="preserve">
5
- <style type="text/css">
6
- #Layer_1 { fill:none }
7
- svg[id = 'Layer_1'] { fill:none }
8
- .st0{fill:none;stroke:#000000;stroke-miterlimit:10;}
9
- </style>
10
- <image style="overflow:visible;" width="368" height="315" xlink:href="data:image/gif;base64,R0lGODlhcAE7Aff/AAAAAAAAMwAAZgAAmQAAzAAA/wAzAAAzMwAzZgAzmQAzzAAz/wBmAABmMwBm
11
- ZgBmmQBmzABm/wCZAACZMwCZZgCZmQCZzACZ/wDMAADMMwDMZgDMmQDMzADM/wD/AAD/MwD/ZgD/
12
- mQD/zAD//zMAADMAMzMAZjMAmTMAzDMA/zMzADMzMzMzZjMzmTMzzDMz/zNmADNmMzNmZjNmmTNm
13
- zDNm/zOZADOZMzOZZjOZmTOZzDOZ/zPMADPMMzPMZjPMmTPMzDPM/zP/ADP/MzP/ZjP/mTP/zDP/
14
- /2YAAGYAM2YAZmYAmWYAzGYA/2YzAGYzM2YzZmYzmWYzzGYz/2ZmAGZmM2ZmZmZmmWZmzGZm/2aZ
15
- AGaZM2aZZmaZmWaZzGaZ/2bMAGbMM2bMZmbMmWbMzGbM/2b/AGb/M2b/Zmb/mWb/zGb//5kAAJkA
16
- M5kAZpkAmZkAzJkA/5kzAJkzM5kzZpkzmZkzzJkz/5lmAJlmM5lmZplmmZlmzJlm/5mZAJmZM5mZ
17
- ZpmZmZmZzJmZ/5nMAJnMM5nMZpnMmZnMzJnM/5n/AJn/M5n/Zpn/mZn/zJn//8wAAMwAM8wAZswA
18
- mcwAzMwA/8wzAMwzM8wzZswzmcwzzMwz/8xmAMxmM8xmZsxmmcxmzMxm/8yZAMyZM8yZZsyZmcyZ
19
- zMyZ/8zMAMzMM8zMZszMmczMzMzM/8z/AMz/M8z/Zsz/mcz/zMz///8AAP8AM/8AZv8Amf8AzP8A
20
- //8zAP8zM/8zZv8zmf8zzP8z//9mAP9mM/9mZv9mmf9mzP9m//+ZAP+ZM/+ZZv+Zmf+ZzP+Z///M
21
- AP/MM//MZv/Mmf/MzP/M////AP//M///Zv//mf//zP////j4+PLy8uvr6+Xl5d/f39jY2NLS0szM
22
- zMXFxb+/v7i4uLKysqysrKWlpZ+fn5mZmZKSkoyMjIWFhX9/f3l5eXJycmxsbGZmZl9fX1lZWVJS
23
- UkxMTEZGRj8/Pzk5OTMzMywsLCYmJh8fHxkZGRMTEwwMDAYGBgAAACwAAAAAcAE7AQAI/gCvCRxI
24
- sKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bN
25
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 4ZZ70Lg1oWtuherO1O664r27J7z0yguTvfROhq9L++ZbWL8sAewvXwKrVPDAd6WK8LUHo9Twwmk9
35
- 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
- SjH/LPTQRBdt9NFIl5tP0kw/FDRBITdtrV5RS90s1QeZOVGHiaFm0opGWh2xQXoNyBtIl6H9WNoG
37
- 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
- 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
- rAWZJ+WbwONmNnXNUedimbupiKA1SZzdulFyYU+kiJwyZqKWrB9ZIIjuMXY+9Wx+nxCGATYZJPsk
40
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- ruLHHFygYY0q6zkvKhp//sYtornJj6weOinZIEUeyJEVXlPaj4QuIH/yVHXf1jH3/vkA6rbfwqzy
64
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- o2Sc/reJZfdoiCpCnBzCVz6nUILKhYTVEVCqaxfKiEBZaf+Af5uhf9mYYNbpnZf2nJU4lIuVRtUZ
83
- QEhZKUo5f4/ilJ6BoOFmpr64GLFISm+5EJPaEAQ6NU3Vn+P1gmyZoP4ZbJvKp0yxq31qciQxl+OW
84
- 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
- eP3VOXD4ntfwoF1hof7CJ5ppmbZTHwRSiAG1PAQlpFmomXPqhT7aNh1WUQe1pAmyIKinei1GZdO6
86
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- vsuOvuXr7OfLveML7c0u7c9u7dEevt+77cwuvteu7d2uvuzb2ORe7u97ZvV7v8UevBLGv/4LwHi+
112
- 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
- 8BS/ZBYP2fqe8TK28Xmdaydj7iRfFvIpo8qEnfIqv/Is3/Iu//IwH/OhERAAOw==" transform="matrix(1 0 0 1 114 263.8898)">
114
- </image>
115
- <a xlink:href="mn://action_schema" xlink:dummy="Layer_1">
116
- <rect x="123.28" y="273.93" class="st0" width="88.05" height="41.84"/>
117
- </a>
118
- <a xlink:href="mn://basic_attribute_schema" >
119
- <rect x="324.69" y="450.52" class="st0" width="132.62" height="40.75"/>
120
- </a>
121
- <a xlink:href="mn://support_resource_schema" >
122
- <rect x="324.69" y="528.36" class="st0" width="148.16" height="40.75"/>
123
- </a>
124
- </svg>
Binary file
@@ -1,64 +0,0 @@
1
- require "spec_helper"
2
- require "utils/hash_transform_keys"
3
-
4
- RSpec.describe Metanorma::Utils do
5
- it "deep stringify hash but skip values" do
6
- Hash.include Metanorma::Utils::Hash
7
- Array.include Metanorma::Utils::Array
8
- result = {
9
- test0: :test0,
10
- test1: false,
11
- test2: {
12
- test20: :test20,
13
- },
14
- test3: %i(test31 test32 test33),
15
- test4: [
16
- {
17
- test41: :test41,
18
- },
19
- ],
20
- }.stringify_all_keys
21
-
22
- expect(result).to include("test0", "test1", "test2", "test3", "test4")
23
- expect(result["test0"]).to eq(:test0)
24
- expect(result["test2"]).to include("test20")
25
- expect(result["test2"]["test20"]).to eq(:test20)
26
- expect(result["test3"]).to include(:test31, :test32, :test33)
27
- expect(result["test4"][0]).to include("test41")
28
- expect(result["test4"][0]["test41"]).to eq(:test41)
29
- end
30
-
31
- it "deep symbolize hash but skip values" do
32
- Hash.include Metanorma::Utils::Hash
33
- Array.include Metanorma::Utils::Array
34
- result = {
35
- test0: "test0",
36
- test1: false,
37
- test2: {
38
- test20: "test20",
39
- },
40
- test3: %w(test31 test32 test33),
41
- test4: [
42
- {
43
- test41: "test41",
44
- },
45
- ],
46
- }.stringify_all_keys.symbolize_all_keys
47
-
48
- expect(result).to include(:test0, :test1, :test2, :test3, :test4)
49
- expect(result[:test0]).to eq("test0")
50
- expect(result[:test2]).to include(:test20)
51
- expect(result[:test2][:test20]).to eq("test20")
52
- expect(result[:test3]).to include("test31", "test32", "test33")
53
- expect(result[:test4][0]).to include(:test41)
54
- expect(result[:test4][0][:test41]).to eq("test41")
55
- end
56
-
57
- it "deep merges hashes" do
58
- Hash.include Metanorma::Utils::Hash
59
- hash1 = { a: [1, 2], b: "c", c: 4, e: { f: { g: "1" } } }
60
- hash2 = { a: [3], b: "d", d: 5, e: { f: { h: "2" } } }
61
- expect(hash1.deep_merge(hash2)).to eq({ a: [1, 2, 3], b: "d", c: 4,
62
- d: 5, e: { f: { g: "1", h: "2" } } })
63
- end
64
- end
data/spec/img_spec.rb DELETED
@@ -1,348 +0,0 @@
1
- require "spec_helper"
2
- require "fileutils"
3
-
4
- RSpec.describe Metanorma::Utils do
5
-
6
- context "recognises data uris" do
7
- it "where the content is an existing file at a relative path" do
8
- expect(Metanorma::Utils.datauri("spec/fixtures/rice_image1.png"))
9
- .to eq Metanorma::Utils.encode_datauri('spec/fixtures/rice_image1.png')
10
- end
11
-
12
- it "where the content is an existing file at an absolute path" do
13
- expect(Metanorma::Utils.datauri(File.expand_path("spec/fixtures/rice_image1.png")))
14
- .to eq Metanorma::Utils.encode_datauri('spec/fixtures/rice_image1.png')
15
- end
16
-
17
- it "where the content is a relative file path pointing to a bogus file" do
18
- expect(Metanorma::Utils.datauri("spec/fixtures/bogus.png"))
19
- .to eq "spec/fixtures/bogus.png"
20
- end
21
-
22
- it "where the content is an absolute file path pointing to a bogus file" do
23
- expect(Metanorma::Utils.datauri("D:/spec/fixtures/bogus.png"))
24
- .to eq "D:/spec/fixtures/bogus.png"
25
- end
26
-
27
- it "where the content is a data/image URI" do
28
- expect(Metanorma::Utils.datauri("data1:img/gif,base64,ABBC"))
29
- .to eq "data1:img/gif,base64,ABBC"
30
- end
31
-
32
- it "where the content is an URL" do
33
- expect(Metanorma::Utils.datauri("https://example.com/image.png"))
34
- .to eq "https://example.com/image.png"
35
- end
36
- end
37
-
38
- it "recognises data uris" do
39
- expect(Metanorma::Utils.datauri?("data:img/gif,base64,ABBC"))
40
- .to eq true
41
- expect(Metanorma::Utils.datauri?("data1:img/gif,base64,ABBC"))
42
- .to eq false
43
- end
44
-
45
- it "recognises uris" do
46
- expect(Metanorma::Utils.url?("mailto://ABC"))
47
- .to eq true
48
- expect(Metanorma::Utils.url?("http://ABC"))
49
- .to eq true
50
- expect(Metanorma::Utils.url?("D:/ABC"))
51
- .to eq false
52
- expect(Metanorma::Utils.url?("/ABC"))
53
- .to eq false
54
- end
55
-
56
- it "recognises absolute file locations" do
57
- expect(Metanorma::Utils.absolute_path?("D:/a.html"))
58
- .to eq true
59
- expect(Metanorma::Utils.absolute_path?("/a.html"))
60
- .to eq true
61
- expect(Metanorma::Utils.absolute_path?("a.html"))
62
- .to eq false
63
- end
64
-
65
- it "rewrites SVGs" do
66
- FileUtils.cp("spec/fixtures/action_schemaexpg1.svg",
67
- "action_schemaexpg1.svg")
68
- FileUtils.cp("spec/fixtures/action_schemaexpg1.svg",
69
- "action_schemaexpg2.svg")
70
- xmldoc = Nokogiri::XML(<<~INPUT)
71
- <standard-document type="semantic" version="1.8.2">
72
- <bibdata type="standard">
73
- <title language="en" format="text/plain">Document title</title>
74
- <docidentifier/>
75
- <docnumber/>
76
- <version/>
77
- <language>en</language>
78
- <script>Latn</script>
79
- <status>
80
- <stage>published</stage>
81
- </status>
82
- <copyright>
83
- <from>2021</from>
84
- </copyright>
85
- <ext>
86
- <doctype>article</doctype>
87
- </ext>
88
- </bibdata>
89
- <sections>
90
- <svgmap id="_d5b5049a-dd53-4ea0-bc6f-e8773bd59052"><target href="mn://action_schema"><xref target="ref1">Computer</xref></target></svgmap>
91
- <svgmap id="_4072bdcb-5895-4821-b636-5795b96787cb">
92
- <figure><image src="action_schemaexpg1.svg"/></figure>
93
- <target href="mn://action_schema"><xref target="ref1">Computer</xref></target><target href="http://www.example.com"><link target="http://www.example.com">Phone</link></target>
94
- </svgmap>
95
- <svgmap id="_60dadf08-48d4-4164-845c-b4e293e00abd">
96
- <figure><image src="action_schemaexpg2.svg" alt="Workmap"/></figure>
97
- <target href="href1.htm"><xref target="ref1">Computer</xref></target><target href="mn://basic_attribute_schema"><link target="http://www.example.com">Phone</link></target><target href="mn://support_resource_schema"><eref type="express" bibitemid="express_action_schema" citeas=""><localityStack><locality type="anchor"><referenceFrom>action_schema.basic</referenceFrom></locality></localityStack>Coffee</eref></target></svgmap>
98
- <svgmap id="_60dadf08-48d4-4164-845c-b4e293e00abd">
99
- <figure>
100
- <svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' id='Layer_1' x='0px' y='0px' viewBox='0 0 595.28 841.89' style='enable-background:new 0 0 595.28 841.89;' xml:space='preserve'>
101
- <a href="mn://action_schema" >
102
- <rect x="123.28" y="273.93" class="st0" width="88.05" height="41.84"/>
103
- </a>
104
- <a href="mn://basic_attribute_schema" >
105
- <rect x="324.69" y="450.52" class="st0" width="132.62" height="40.75"/>
106
- </a>
107
- <a xlink:href="mn://support_resource_schema" >
108
- <rect x="324.69" y="528.36" class="st0" width="148.16" height="40.75"/>
109
- </a>
110
- </svg>
111
- </figure>
112
- <target href="mn://action_schema"><xref target="ref1">Computer</xref></target><target href="http://www.example.com"><link target="http://www.example.com">Phone</link></target>
113
- </svgmap>
114
- <svgmap id="_60dadf08-48d4-4164-845c-b4e293e00abd">
115
- <figure>
116
-
117
- <image src='data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI1LjAuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCA1OTUuMjggODQxLjg5IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA1OTUuMjggODQxLjg5OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGw6bm9uZTtzdHJva2U6IzAwMDAwMDtzdHJva2UtbWl0ZXJsaW1pdDoxMDt9Cjwvc3R5bGU+CjxpbWFnZSBzdHlsZT0ib3ZlcmZsb3c6dmlzaWJsZTsiIHdpZHRoPSIzNjgiIGhlaWdodD0iMzE1IiB4bGluazpocmVmPSJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhjQUU3QWZmL0FBQUFBQUFBTXdBQVpnQUFtUUFBekFBQS93QXpBQUF6TXdBelpnQXptUUF6ekFBei93Qm1BQUJtTXdCbQpaZ0JtbVFCbXpBQm0vd0NaQUFDWk13Q1paZ0NabVFDWnpBQ1ovd0RNQUFETU13RE1aZ0RNbVFETXpBRE0vd0QvQUFEL013RC9aZ0QvCm1RRC96QUQvL3pNQUFETUFNek1BWmpNQW1UTUF6RE1BL3pNekFETXpNek16WmpNem1UTXp6RE16L3pObUFETm1Nek5tWmpObW1UTm0KekRObS96T1pBRE9aTXpPWlpqT1ptVE9aekRPWi96UE1BRFBNTXpQTVpqUE1tVFBNekRQTS96UC9BRFAvTXpQL1pqUC9tVFAvekRQLwovMllBQUdZQU0yWUFabVlBbVdZQXpHWUEvMll6QUdZek0yWXpabVl6bVdZenpHWXovMlptQUdabU0yWm1abVptbVdabXpHWm0vMmFaCkFHYVpNMmFaWm1hWm1XYVp6R2FaLzJiTUFHYk1NMmJNWm1iTW1XYk16R2JNLzJiL0FHYi9NMmIvWm1iL21XYi96R2IvLzVrQUFKa0EKTTVrQVpwa0FtWmtBekprQS81a3pBSmt6TTVrelpwa3ptWmt6ekprei81bG1BSmxtTTVsbVpwbG1tWmxtekpsbS81bVpBSm1aTTVtWgpacG1abVptWnpKbVovNW5NQUpuTU01bk1acG5NbVpuTXpKbk0vNW4vQUpuL001bi9acG4vbVpuL3pKbi8vOHdBQU13QU04d0Fac3dBCm1jd0F6TXdBLzh3ekFNd3pNOHd6WnN3em1jd3p6TXd6Lzh4bUFNeG1NOHhtWnN4bW1jeG16TXhtLzh5WkFNeVpNOHlaWnN5Wm1jeVoKek15Wi84ek1BTXpNTTh6TVpzek1tY3pNek16TS84ei9BTXovTTh6L1pzei9tY3ovek16Ly8vOEFBUDhBTS84QVp2OEFtZjhBelA4QQovLzh6QVA4ek0vOHpadjh6bWY4enpQOHovLzltQVA5bU0vOW1adjltbWY5bXpQOW0vLytaQVArWk0vK1paditabWYrWnpQK1ovLy9NCkFQL01NLy9NWnYvTW1mL016UC9NLy8vL0FQLy9NLy8vWnYvL21mLy96UC8vLy9qNCtQTHk4dXZyNitYbDVkL2YzOWpZMk5MUzBzek0Kek1YRnhiKy92N2k0dUxLeXNxeXNyS1dscForZm41bVptWktTa295TWpJV0ZoWDkvZjNsNWVYSnljbXhzYkdabVpsOWZYMWxaV1ZKUwpVa3hNVEVaR1JqOC9Qems1T1RNek15d3NMQ1ltSmg4Zkh4a1pHUk1URXd3TURBWUdCZ0FBQUN3QUFBQUFjQUU3QVFBSS9nQ3ZDUnhJCnNLREJnd2dUS2x6SXNLSERoeEFqU3B4SXNhTEZpeGd6YXR6SXNhUEhqeUJEaWh4SnNxVEpreWhUcWx6SnNxWExsekJqeXB4SnM2Yk4KbXpoejZ0ekpzNmZQbjBDRENoMUt0S2pSbzBpVEtsM0t0S25UcDFDalNwMUt0ZXJJZS8reWF0M0t0YXZYcjJERGloM3I5WjdWczJncAovcXU2TnEzYnR3cmJUcFVMdDI1ZHVsSHgydDE3VnU5VHYzd0Q1MlVydURCVndBcXRJU2tUVWpIampZZ05TejRhdWFDenh5S3R5Zm1ICk9XUGx5YUNEZmhhb3VYUGp4UnhIaDE2OVV5Nm5yQkFFT3N1YVFOYm1meENlbFVoMFRmRy9BTHgxSTBLQ08rRW8yck91emY2WFlKWmkKTXB1YlgzdEc0cDhPNVFtTzY5QXU4SFh4Z2FwWi9vdTMyZlpaaTFuUFRLQlg3N2c5RXVDbHIzRVNJSXU0Z0ZuT2dCKzBwaVE1cS9YTwpMYVlZY0xvbFlzMGNCaVl4bkhYVTZaQWVldWM5Q041NEZBSkYxMnozalhMZFFJNU50MXVCSGlZQ0lvZ0h2YmFoaGdSMTZCaDFXcFh4CjRJdnF5ZmJQZlJOV2FHTnJwQ0VCQVgrempCSWJoNmdWbUY5d0grNFdZa0tLWmZoampveXRHS05BTUFLbzJJNzkxWGpqbGVRSjVHTnYKL1kzb1JZY0ZUb2tkZWthU1dKQTFnZ2pVaVlobGZvbGFlM0pjZDFtVUQyN0pvNVZZNWhsVGVkVWh0eHlOcnowUUhYclYzYWZaakxZeApsOXlaeEgzMzV5eXZBZmZhZlN6dXVCbDBuQjJYVzUrS0NoU2VucUNHOUdsUm80WnFLbVNFbmFycVNhVkN4T0pXL3ZxbDFPcXF0RVkwCnEyaTE1Z3JTclJicTZtdHFaQVVyN0xERWl2WHJzUmp4K3BPeXlQN0tiRS9QTnB0cnREaEthKzFEMU9xVTdiV21ib3VUdDl6cUNXNlcKNFpaNzBMZzFvV3R1aGVyTzFPNjY0cjI3Sjd6MHlndVR2ZlJPaHE5TCsrWmJXTDhzQWV3dlh3S3JWUERBZDZXSzhMVUhvOVR3d21rOQpiSkxFRUZ0Rk1Va1hWenlYd2hvZm03RklIM2Y4RjhjaTY4cFBzU2luckxKWC9KVHM4a1QxdkN5enRqUFhUSzdOT04rYjg4Nzg4dXl6ClNqSC9MUFRRUkJkdDlORklsNXRQMGt3L0ZEUkJJVGR0clY1UlM5MHMxUWVaT1ZHSGlhRm0wb3BHV2gyeFFYb055QnRJbDZIOVdOb0cKbWMwUTIySW5oYlZCV25NVW4wZngzVTEzL3RoSXltRmEzRVU5amVlaHZ3VlgzWW5JS1llY2JvRDgwMFdSaDFSWEJ1RzVHZW1iZnNJUgp0NlJCM2xtYWxhQ3dNZTQ0NUllYlBTQWl0OFhHNG9hQUkwVVhKN0VOZVdDQ0JsYjUzNFBQYVg0NmNjMk5ZcWlBN3hub3QzejAyWWRmCnJBV1pKK1did09ObU5uWE5VZWRpbWJ1cGlLQTFTWnpkdWxGeVlVK2tpSnd5WnFLV3JCOVpJSWp1TVhZKzlXeCtueENHQVRZWkpQc2sKY3VJZysyQ0d2ejFsQTBrZm9vUXBRb0tTQ0RLaUl2SEdlMkRhelpEK3g3Nzk2SWhIS3ByZjkrcDN2KytCNlVuNzR4OXA1QkM5NnNWSgpPWk5MMHpYVzVLVUNnbzh4em1oT0FnMmtvekdaOENCMjZrOEUxVWUvTXJFSE5iSjcwd2ZobHNHZENNNVQvZ1NzemdGSVFLbnF4TVkzCmpzb0tmVGF6Uk9hc29rODBrczgvUUJlOVFqbUhpWW1TVHZJNDFaelh4Q1pRV0l4T29tYTBLTzhNOFQ1ZW5JNFJlK2lUdVlXa2JteVUKbGh0QkFzYzRJbXVPZURQZVJWNmxGZVRaOFY5aysyUFNmbmlOcWdtU1ZvWThwS3I4VXNlSGNBMUpYaXNKMkxSWGtrWXE4aU5sQzE1SQplTWdSdG5FeVIzNUV5Q2UzcHNtMy9lMlN0c29hM3pxaU43c05yNVVFWE9WK2hwY1JTM0tJbHFoc0NDSHBRampNSFU1TGlWdE9CeHYzCk9EWkZqak9VUXg5eE1GZUNCVzJ1SUowakhPaHdJN3BpNnVhWU9qRGRlMUFIR3pWYXh6aUpXNTM1ZnFrNDVvenhtYmxFeUJ4aHB4ejQKWEM5N2Q3cmREY21ndTIzeXJrZS8vcHRjOE9Jem4vcVFjWUYwaTlBTjVhZFA1d1VQZW9TYW5nWGY5RTVLY3NoMnptbG9tQ1E2MEVlbQpNeTZCSkUzMi9xZS84VjBEUmYycjRRR0JSOFAyTWRCOW9pVGpETTFud081VU1FVDVheEZDUE1wSGhkWVVwRXk2S0VQYzZML3pZVEJICkF3enBCQzBIVHdrdWNIMG9aUlNWNHRjYkNaN1VwU2E4NEtLNlJpa00rblNxV3dMU0tYVUt0WXoyaG9Oa0VwNmNRcWdta3o3REN5YjAKWHdxWkdxWVdydldGQm9raFUxZjRWTnpoRUQ0NkhPdCtSTGdtell3MVREdFU2SFRjdEZXdUNtU1hRZnpIR1FsVkhDVCs2RStKYW1JQwpucWpFTWs1eFVDd3lWQmc3dFVXdGRMRTRZRVNVR0c4VFJUTVNFVkxGcVJSQ0hBc2xJeDZxaUVray9xTVUwV25ZaExUTGxyWHQxa2h3Cm0xdFFxY3MzVWF3SUg3TVNTcE1NdDNDOU5WaHlhNGJZNWNvTWo4N3RHSFJyS2N1SVdOU0JoYVd1UTZQTEtxODZaSlFCTE81R3dNdksKVW5KWFZ0NWxDQ3hWdVYyTnJKZU8xVDB2U1pvckk2MWNaM1dVVysxdGZQbk5qd1p6Y1NVZ0p1bVFtVHBsSWpkejMrSGNQMEhiemN6aApsYi9saysrdU9MUlJPelgwdWdSaHArd3VERkc3MHRPZ0FWaFE3L0pwdXVIMTAzZ0FQUk10U3dFaEFDRVZwZzJWTU1nNGhLQ1BxaTU4CkdOYm9CRHZhWDV5eTFLVHBxMnRMRy9sVzdjSHZ4ZWZUbjR3bjNEOHJUZ2VET1ZaalNRRUlwS0JDU2FTOUtXcEpqenJrK0g2MURDeHUKNmxLUi9LR2ZMaG1USElyQy9sUy9PdFlvYTZhRFlnVWhtc3BhUXZxUkFJVXFsS0NZM3RyQWxENUdybTFGSVh3Q2UyYU0wSmR3V1ZIZgpHbWVMRUJZdFZyV3NMV2NUSlV0WjJVcVJpb3pWckdnNTJ6WTZMSXFQQ0hBQ0dVMExXOW9XT3BVRjZSNHIra2VEbVBEMjFCcnNLdmtHCk1vcnNudVRWc0NhVlZ4RWQ0YzdDcXIwWEFlNmFKM0pjOGVZYXZhaytkcjdvcTJ5RUpiTFpicUdXUlhHOU4yQkQyeW1qSWkrampMMFEKdDEzN01CQjViNk85ekJCcWY5c256RjVPVnU1YnV0U3g5NnZFYmUrazhNUGcxRFp6bjVvVTU3bVh0ZXNLSC9IQ2tRd3ZielFzM3J1eApXSGt2NnJLQllyeHZhTzI2eGx1cWFaVER0RkVpUjgvSVpDUXorR1RhY0o3TU1iUEpvZkxFL2o5MDV5UE5Fc3pKbVJLUE5FN2xqbnQ4CjEycE9VV0JITGp3NHY0OHpXanBpbDZwMzF6aHIyK1V4T2ZSdEV1M05INlZSeFlweTlHbFg2K25XYWlYVW84N0tveGNOOUY2Ulp0VlEKYW5YVmRTVVhuTlo2NjF5L3BYMFZVbXhnbHgzczBVYTdyNWl0OWxWTnQrMmhldnRRekExM2o4aGRsTFptaWJmcnZwSzd0dzJYTmFFNwozemVTN3EydzJ6cjUzWnN6dTlQTkZHcUhPOTdzTmVQdk01c3ZOdmplRHpaY2Z3ZVBNUXJ6eHNLMHk3R3doNFJ3RS9qVFFTUndFSHNZCnJ1TEhIRnlnWVkwcTZ6a3ZLaHAvL3NZdG9ybkpqNndlT2luWklFVWV5SkVWWGxQYWo0UXVJSC95VkhYZjFqSDMvdmtBNnJiZndxenkKblp1MXpNTTJQcE43L2hQelc3WTU0TEg4SHFDaGp6dEMrem5uWEFwcmgyUm5mdTBiZXRkRHg3bHFHWTEwU25NSzZwZ3FnNmFLbnBpbQplek1yVUlkR1VuZGE4K2QreWJKcldEY2RXbWVBb09GR1hwZDNEQWdYYnNSclpNY3A4YVlSWnhlQjg1SnNHbWdqYk5lQlYvSnNJRmd0ClRkVVpnb2RkSnppQzZRSkozR1laYTNOS2UvYytFS2lDQVVOMjVDWnpUUUo0NFNkOU0waURJMEZmNkxOZndCWk50ekZObFNOZ3hsUTYKK0JaaTdxWnZQdWd3R2VVMkJOZGVwVGRYemJNakIwVUNWU1JZZ2RZYnMvZUVuY2VCTUZWeDVBWS9LNVZXWVdNL1VSVWt2d2VHWVNocgpIRlZTRHJSVVo0aGw4dkZTWGRoeWJsZ1NQT1ZCTmhkWE9tZUZjb2hrQTlWT0xKU0QvbnExaC9NVmhaZ2xSRXZuYTRxU1JxRWxXV05VCldnTW9nTGhuYW9yNGhwc1lHaUxZaVMveEdSa0lpbEx4aWFSWUVoOTRpbWtuaHFvb2dic1djQ25JS0lKMWF6ZElpbklYZ3dyaFNUQm8KWGpLWUViaUlkM3Q0ZDYrV056b29WRHlJZ2JYNFpYc0loSllqaERNRkc5SlVZQUUyT2ttSWVFdklUYWxGVGpBVVRyODBJdVFrVE9kMAppbTBoaGJFalhsVTRRNzZCaFFTaWhRbTFoazN5aGFRQlViUGpQUk5GTzNhbFR6MElnbkpCY1VrRmZDckZQSVBZVW5mb2p2K0hjeVhTClh6V1ZaQzNpWTFIbWh2dEljbkxZTmc4a1F3RDVZeFJFa0hyb1FGVTFWVmRGYTV2VGtHRDRrRFVYVmpBVWlIVTRWTUZSaURtRWlDQzAKVjJYbFZ5QUUvbGgvMVNZZ3FZSE5kU2hWcEZpUG1GaklJWW1YdFdtMVFWcVdwWk9ZeUg4TzFFMUY5MXFNOVZpVlJYOVA2SGV0dURHcwpHSlZqTTVWWlk0SElwUktqU0pVUUFaVmMrUlNwK0pXcktKWjJZVWlUUkphMXh4SzY2RUF0S0J2NWlKWkF0QkxFdUZXNEpXNXdlVmhlCmhXQkcxM2paWVIyUTU0UUs1anhGS0kxSWVFMUsrR0RZaUh1U0o1WnpNM29FSWxDbjF5QzRBNC9UQVh2b1dFL3J1SVVFT1k4YmRaZUYKbEpkOXhuc3UxbnR0YUJuL1NGQVdtWVo0eUhPS3huRjMyWWNMNVh5akdYMlFSSWNWaVlabm80YjRFeVJtOXBxZ0tYNkJTQ2ZzMFg0RQpJVmNuV1ZjcWlWY3MrWE90ZUpPYk5WbjNKMnI1dDM4RkNJbWZaWG1nUTRsQy9zbDRSSWxhbWVpWnRnV2VZeW1lRnVNUlcwbWVMV0dLCjZBa3o2YldlU3VHVjdva3JWaWtUWjBtTDFzYUE4UGtSYXltUmJkbVNHUEdMQjhHY0xwZWZyUFJLeFhobDk2bU0ycVZlQjJvUldMRXkKRUJxaEVqcWhZbUVXVE1HTWl5ZEZ4ZUY0Zm9tUTJoaVludk9UMURTTjFsUUMyS1JOVE5oZ0gxb1F4OUVwNHVTTi9RV083b1lxVndOdQpUZlZQajdrZWtabDZrMGs3V1dPWkFKbU96OE9PMHJPWmxCbFBFV1dQMVVOUjhWT1RFcUdlM0dPalB5WWpHK2w3cnVtUCtWU0NxWm1iCnEzbUlCYmxWTkJVK0NwbG9EQWwrQjFpalV2bGoxVGViVWRJMXRvbWF1QWxWdTZrK3ZTbVJHeWxVVkpaVk9aVWFjaVNsSmpSK3N3bVQKbzJTYy9yZUpaZmRvaUNwQ25CekNWejZuVUlMS2hZVFZFVkNxYXhmS2lFQlphZitBZjV1aGY5bVlZTmJwblpmMm5KVTRsSXVWUnRVWgpRRWhaS1VvNWY0L2lsSjZCb09GbXByNjRHTEZJU20rNUVKUGFFQVE2TlUzVm4rUDFnbXlab1A0WmJKdktwMHl4cTMxcWNpUXhsK09XCm9IWnBYYkphRWJtNlUrMkpFZWRwWEZqcHErbDVaZGpFblQvU29qWW5UTm5ucmRFWU9pUTZZTmwwalUyNG9zWDVYNHJ5SElNU2VkangKZVAzVk9YRDRudGZ3b0YxaG9mN0NKNXBwbWJaVEh3UlNpQUcxUEFRbHBGbW9tWFBxaFQ3YU5oMVdVUWUxcEFteUlLaW5laTFHWmRPNgpFREZERGw5QkRzNEdxM2RJcGNsQlU3dmhZemVYcFhUMVlnTzVzTVYzL3BBblVqNHpsSkRrOXlUd2d5ZE1vYTlhd2EvOUNyTDJzNlpBCkZWWjZ1bG9US1loYktxY0xSYWZqeWloV3BxVk93cEV6R3lCTFpiTkx3YkZjNGJFZmF6N3FZWnlNaW1SZVVKTHBkNXlFeUZRcnlXYkQKbWlKYlM1TkJHbGpDMlNPQktMVkxnYk02dTdQd0psdDhWQnVONGpuTjBhcDB3MFdnT29sWk5LcmNXYXFkYW1xUjlpaVJrZ2p6cHFxWApzcW1hVXJlTGtyRU9RYlZaWWJWWGUwZE5JVGdQR3JkeWE3bkhTaEJVUzdud3NnM3hVQS95MEEzYmNxMlZsSzNDYW5kTmdSZFk0Uy9iCm9BL2xFQTdrOExwb3VoUjR3YkgrRWcvbE1CRGdBTGxXaDd0YnNRN1hvQThDc1E3RFN4RElxeFhFT3hETG14WE5lN3pKNjd6VEs3M00KL3F1ODFYc056L3NQMGF1OTJidTkzUXUrMkh1OTFFdSsxZ3U5eXNzUDJ3QTFGTnErN3Z1K0tOTVUzYnN3OVJBT0E4RU53TXR2SFJjTwo5ckMrMlVBUCtkdEdRQ2NPKy9BUC9GQU9BZXh3YUpmQUw3ZkF5Ym9VOHlzeURFeUMrUHBjRDF6QkJMRTBGVFBCTk5PNTg1a3ZISndUCklmeVpIMXd2RjV3VUVTeVNtK3N4TmdxZ0VpR2dEd0hEcm5QQ0l3T3lGdkdzMXRXZzJFYkRPOHl0NUdTdjViUnVmOWRObDJOdDRCcHkKN1lhVWFjckNhWXBRUldxWi9pYTBPU2crd1pVaThnaHd0MG9VSTN3VEk1ekN4aGl5aW1Nb0VFZTRUdFZJWVpwNzBkckRuSXU3ditsUwpQcHQ4MkdXSXltcW50S21sSk9Nckl3eWJ5bWVjM1FkSjhoTTcvbHAwSm96NnFFNkt3VXpNeG1KSU9EUlN0Mk5FZEFlSmUxV01xdDh4CmYwZTN4TTdTdXRXS0pBbjREQXVJU0R4c0ZGNzhFQTlvTXZCYnlxWjh5bG5STXBZc2ZmYUZ1azczYS9GNWZMRzh5clBzd2JXTUZLRnMKeHpic0VCSDBEdzZReHJkOHB2ZTZiYXRidHJOVHE4R01xNW04eTMxamdzbVl6QmVoeDcya2VmZDFiNEpwcnNjMG90VHNJWTJUeGREYwptSm8waFp5NUlKU25uTS9EYys0MHNab0R6UldSeS96SVVTMkNrY1FucHMvTXpnNGhrajJGZmNhWWg4Um5WZlZzejlTS29HK21mbXJMCnNncjNxTWdNMEhHSms0dzFkZGNzV2FnRk9rT1VGWmlTazU0VHlRcjlwQmtkRkxtODBRbzh6Qjdkd1NBZDB0K3l6Q1JORThoNi90SXEKNGM3VlpVc0pyZEwzREVvTzVjSzlXc3d3SGMxZnZJTUo4ZEkzcmN5d2FxK0c2YUhmeE5NOUhaNElXb1ZPZkdlY2FWSkZyUkVzZlRiRAp4NlVKK2M5TjdkTncySHdycDVwVVJ0UkZEWnVBWmtOWE5KTTJYZFVZeFlHdmhhbEIyWlJKeVVSSlM5YllZdEp1blJJZEhkY3JTTmRjCmJOZDNqZGQxcmRjc01kZDhEWVdzS0tBeS9OZnFCSDk1aDhPZ2dyT292TmlNamNxYVc5Sm12YTZJZHlsSW9BTXpPaTBRbzU0VHlGQ2gKcHlCcFVzaDVzc1dVeWhPNUhGTkVwMHplUEI2aXJjV2pMVlVFcEFMWEFkcFlzdHBEQWJ6ZGsxY3hTUVB6Q014eGw5bWp6V2lLdXlsRgpHWFo1SXR1Nit0dVZheEtEalJPSGt0cm40aE4rdmNMTC9xckRRR0hjQWQzQUl3M0N0RVliQXN0Q0JHS2lrdU1oeC9RWVJjek5XMEZiCm91TWk1SFRFTjVwNTU5ek40aXF2Q01IZTRncXZMdnBMSExvZDlhckVKUHh5aXAyelY0dWtCU1JpK09SUEkzWkZWT3hQUnlTcjZjaXcKQ0NTUEprWXAxTE40OTdqVSsvR3dUUnF4QzZmT0RNS2p2UWQ3Ym52WGtsdTFsVXV5S0ZtQ3FCMm56TWRqR3hLbkwrWmpMYXRnTHh0QQpCQ1d6c3lteUlVNHUvLzNZNjhKTEFrU1NMMGFQUkpVSVhBWmswVG9pWnBZa3gzUGlMNzQ1R1VuSFFSdXpWdlcwUGh1WHBDMFFJejY1CkN6T09nOXh6YXJXRlk3Sm5OcWQ3aE56bGdDeTIzKzArWi9Xb0xqbENaaFdwY1BKWFR5dFhPWjRUY092Yk4vb2RwRlpwL29zTVJaOW0KUlVycHFodEV0MnNVYVhCc1dnR2dBckxWcXFjS0pFaHB1SVdUdUs2MXVKbENUWHhyNVQ4eDRxQXIzVFpJU1Z4ZGxrT1J1UnY4RUZyego2UWtqRko4THU2TmJ1cW9oYkRsaWFhU3V1aXpoeWpQV0UvTnJ1L1FTdTdOYnU3UXRGSnBkRUxxYkw3enJ1NzB1bnp4UkQ4bHJ2TjVyCnZzdU92dVhyN09mTHZlTUw3YzB1N2M5dTdkRWV2dCs3N2N3dXZ0ZXU3ZDJ1dnV6YjJPUmU3dTk3WnZWN3Y4VWV2QkxHdi80THdIaSsKWkFSc3dBZ2M3N0MyN3ZxYmEvZ3V3TWUyN3g5OTcvWithdjZPM1FDLzVjbzI4QlFzOEFGZmFBZ3YwZ1dmM0FwdjhQMis4R2ZXOENKOAo4QlMvWkJZUDJmcWU4VEsyOFhtZGF5ZGo3aVJmRnZJcG84cUVuZklxdi9JczMvSXUvL0l3SC9PaEVSQUFPdz09IiB0cmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAxIDExNCAyNjMuODg5OCkiPgo8L2ltYWdlPgo8YSB4bGluazpocmVmPSJtbjovL2FjdGlvbl9zY2hlbWEiID4KCTxyZWN0IHg9IjEyMy4yOCIgeT0iMjczLjkzIiBjbGFzcz0ic3QwIiB3aWR0aD0iODguMDUiIGhlaWdodD0iNDEuODQiLz4KPC9hPgo8YSB4bGluazpocmVmPSJtbjovL2Jhc2ljX2F0dHJpYnV0ZV9zY2hlbWEiID4KCTxyZWN0IHg9IjMyNC42OSIgeT0iNDUwLjUyIiBjbGFzcz0ic3QwIiB3aWR0aD0iMTMyLjYyIiBoZWlnaHQ9IjQwLjc1Ii8+CjwvYT4KPGEgeGxpbms6aHJlZj0ibW46Ly9zdXBwb3J0X3Jlc291cmNlX3NjaGVtYSIgPgoJPHJlY3QgeD0iMzI0LjY5IiB5PSI1MjguMzYiIGNsYXNzPSJzdDAiIHdpZHRoPSIxNDguMTYiIGhlaWdodD0iNDAuNzUiLz4KPC9hPgo8L3N2Zz4K' id='__ISO_17301-1_2016' mimetype='image/svg+xml' height='auto' width='auto' alt='Workmap1'/>
118
- </figure>
119
- <target href="href1.htm"><xref target="ref1">Computer</xref></target><target href="mn://basic_attribute_schema"><link target="http://www.example.com">Phone</link></target><target href="mn://support_resource_schema"><eref type="express" bibitemid="express_action_schema" citeas=""><localityStack><locality type="anchor"><referenceFrom>action_schema.basic</referenceFrom></locality></localityStack>Coffee</eref></target></svgmap>
120
- </sections>
121
- </standard-document>
122
- INPUT
123
- Metanorma::Utils.svgmap_rewrite(xmldoc)
124
- expect(xmlpp(xmldoc.to_xml.gsub(%r{<image.*?</image>}m, "<image/>")
125
- .gsub(%r{<style.*?</style>}m, "<style/>")))
126
- .to be_equivalent_to xmlpp(<<~OUTPUT)
127
- <?xml version='1.0'?>
128
- <standard-document type='semantic' version='1.8.2'>
129
- <bibdata type='standard'>
130
- <title language='en' format='text/plain'>Document title</title>
131
- <docidentifier/>
132
- <docnumber/>
133
- <version/>
134
- <language>en</language>
135
- <script>Latn</script>
136
- <status>
137
- <stage>published</stage>
138
- </status>
139
- <copyright>
140
- <from>2021</from>
141
- </copyright>
142
- <ext>
143
- <doctype>article</doctype>
144
- </ext>
145
- </bibdata>
146
- <sections>
147
- <svgmap id='_d5b5049a-dd53-4ea0-bc6f-e8773bd59052'>
148
- <target href='mn://action_schema'>
149
- <xref target='ref1'>Computer</xref>
150
- </target>
151
- </svgmap>
152
- <figure>
153
- <svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' id='Layer_1_000000001' x='0px' y='0px' viewBox='0 0 595.28 841.89' style='enable-background:new 0 0 595.28 841.89;' xml:space='preserve'>
154
- <style/>
155
- <image/>
156
- <a xlink:href='#ref1' xlink:dummy='Layer_1_000000001'>
157
- <rect x='123.28' y='273.93' class='st0' width='88.05' height='41.84'/>
158
- </a>
159
- <a xlink:href='mn://basic_attribute_schema'>
160
- <rect x='324.69' y='450.52' class='st0' width='132.62' height='40.75'/>
161
- </a>
162
- <a xlink:href='mn://support_resource_schema'>
163
- <rect x='324.69' y='528.36' class='st0' width='148.16' height='40.75'/>
164
- </a>
165
- </svg>
166
- </figure>
167
- <svgmap id='_60dadf08-48d4-4164-845c-b4e293e00abd'>
168
- <figure>
169
- <svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' id='Layer_1_000000002' x='0px' y='0px' viewBox='0 0 595.28 841.89' style='enable-background:new 0 0 595.28 841.89;' xml:space='preserve'>
170
- <style/>
171
- <image/>
172
- <a xlink:href='mn://action_schema' xlink:dummy='Layer_1_000000002'>
173
- <rect x='123.28' y='273.93' class='st0' width='88.05' height='41.84'/>
174
- </a>
175
- <a xlink:href='http://www.example.com'>
176
- <rect x='324.69' y='450.52' class='st0' width='132.62' height='40.75'/>
177
- </a>
178
- <a xlink:href='mn://support_resource_schema'>
179
- <rect x='324.69' y='528.36' class='st0' width='148.16' height='40.75'/>
180
- </a>
181
- </svg>
182
- </figure>
183
- <target href='mn://support_resource_schema'>
184
- <eref type='express' bibitemid='express_action_schema' citeas=''>
185
- <localityStack>
186
- <locality type='anchor'>
187
- <referenceFrom>action_schema.basic</referenceFrom>
188
- </locality>
189
- </localityStack>
190
- Coffee
191
- </eref>
192
- </target>
193
- </svgmap>
194
- <figure>
195
- <svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' id='Layer_1_000000003' x='0px' y='0px' viewBox='0 0 595.28 841.89' style='enable-background:new 0 0 595.28 841.89;' xml:space='preserve'>
196
- <a href='#ref1'>
197
- <rect x='123.28' y='273.93' class='st0' width='88.05' height='41.84'/>
198
- </a>
199
- <a href='mn://basic_attribute_schema'>
200
- <rect x='324.69' y='450.52' class='st0' width='132.62' height='40.75'/>
201
- </a>
202
- <a xlink:href='mn://support_resource_schema'>
203
- <rect x='324.69' y='528.36' class='st0' width='148.16' height='40.75'/>
204
- </a>
205
- </svg>
206
- </figure>
207
- <svgmap id='_60dadf08-48d4-4164-845c-b4e293e00abd'>
208
- <figure>
209
- <svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' id='Layer_1_000000004' x='0px' y='0px' viewBox='0 0 595.28 841.89' style='enable-background:new 0 0 595.28 841.89;' xml:space='preserve'>
210
- <style/>
211
- <image/>
212
- <a xlink:href='mn://action_schema'>
213
- <rect x='123.28' y='273.93' class='st0' width='88.05' height='41.84'/>
214
- </a>
215
- <a xlink:href='http://www.example.com'>
216
- <rect x='324.69' y='450.52' class='st0' width='132.62' height='40.75'/>
217
- </a>
218
- <a xlink:href='mn://support_resource_schema'>
219
- <rect x='324.69' y='528.36' class='st0' width='148.16' height='40.75'/>
220
- </a>
221
- </svg>
222
- </figure>
223
- <target href='mn://support_resource_schema'>
224
- <eref type='express' bibitemid='express_action_schema' citeas=''>
225
- <localityStack>
226
- <locality type='anchor'>
227
- <referenceFrom>action_schema.basic</referenceFrom>
228
- </locality>
229
- </localityStack>
230
- Coffee
231
- </eref>
232
- </target>
233
- </svgmap>
234
- </sections>
235
- </standard-document>
236
- OUTPUT
237
- end
238
-
239
- it "rewrites SVGs with namespaces" do
240
- FileUtils.cp "spec/fixtures/action_schemaexpg1.svg",
241
- "action_schemaexpg1.svg"
242
- FileUtils.cp "spec/fixtures/action_schemaexpg1.svg",
243
- "action_schemaexpg2.svg"
244
- xmldoc = Nokogiri::XML(<<~INPUT)
245
- <standard-document type="semantic" version="1.8.2" xmlns="http://www.example.com">
246
- <bibdata type="standard">
247
- <title language="en" format="text/plain">Document title</title>
248
- <docidentifier/>
249
- <docnumber/>
250
- <version/>
251
- <language>en</language>
252
- <script>Latn</script>
253
- <status>
254
- <stage>published</stage>
255
- </status>
256
- <copyright>
257
- <from>2021</from>
258
- </copyright>
259
- <ext>
260
- <doctype>article</doctype>
261
- </ext>
262
- </bibdata>
263
- <sections>
264
- <svgmap id="_d5b5049a-dd53-4ea0-bc6f-e8773bd59052"><target href="mn://action_schema"><xref target="ref1">Computer</xref></target></svgmap>
265
- <svgmap id="_4072bdcb-5895-4821-b636-5795b96787cb">
266
- <figure><image src="action_schemaexpg1.svg"/></figure>
267
- <target href="mn://action_schema"><xref target="ref1">Computer</xref></target><target href="http://www.example.com"><link target="http://www.example.com">Phone</link></target>
268
- </svgmap>
269
- <svgmap id="_60dadf08-48d4-4164-845c-b4e293e00abd">
270
- <figure><image src="action_schemaexpg2.svg" alt="Workmap"/></figure>
271
- <target href="href1.htm"><xref target="ref1">Computer</xref></target><target href="mn://basic_attribute_schema"><link target="http://www.example.com">Phone</link></target><target href="mn://support_resource_schema"><eref type="express" bibitemid="express_action_schema" citeas=""><localityStack><locality type="anchor"><referenceFrom>action_schema.basic</referenceFrom></locality></localityStack>Coffee</eref></target></svgmap></sections>
272
- </standard-document>
273
- INPUT
274
- Metanorma::Utils.svgmap_rewrite(xmldoc)
275
- expect(xmlpp(xmldoc.to_xml.gsub(%r{<image.*?</image>}m, "<image/>")))
276
- .to be_equivalent_to xmlpp(<<~OUTPUT)
277
- <?xml version='1.0'?>
278
- <standard-document type="semantic" version="1.8.2" xmlns="http://www.example.com">
279
- <bibdata type="standard">
280
- <title language="en" format="text/plain">Document title</title>
281
- <docidentifier/>
282
- <docnumber/>
283
- <version/>
284
- <language>en</language>
285
- <script>Latn</script>
286
- <status>
287
- <stage>published</stage>
288
- </status>
289
- <copyright>
290
- <from>2021</from>
291
- </copyright>
292
- <ext>
293
- <doctype>article</doctype>
294
- </ext>
295
- </bibdata>
296
- <sections><svgmap id="_d5b5049a-dd53-4ea0-bc6f-e8773bd59052"><target href="mn://action_schema"><xref target="ref1">Computer</xref></target></svgmap>
297
- <figure>
298
- <svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' id='Layer_1_000000001' x='0px' y='0px' viewBox='0 0 595.28 841.89' style='enable-background:new 0 0 595.28 841.89;' xml:space='preserve'>
299
- <style type='text/css'>
300
- #Layer_1_000000001 { fill:none } svg[id='Layer_1_000000001'] {
301
- fill:none } .st0{fill:none;stroke:#000000;stroke-miterlimit:10;}
302
- </style>
303
- <image/>
304
- <a xlink:href='#ref1' xlink:dummy='Layer_1_000000001'>
305
- <rect x='123.28' y='273.93' class='st0' width='88.05' height='41.84'/>
306
- </a>
307
- <a xlink:href='mn://basic_attribute_schema'>
308
- <rect x='324.69' y='450.52' class='st0' width='132.62' height='40.75'/>
309
- </a>
310
- <a xlink:href='mn://support_resource_schema'>
311
- <rect x='324.69' y='528.36' class='st0' width='148.16' height='40.75'/>
312
- </a>
313
- </svg>
314
- </figure>
315
- <svgmap id='_60dadf08-48d4-4164-845c-b4e293e00abd'>
316
- <figure>
317
- <svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' id='Layer_1_000000002' x='0px' y='0px' viewBox='0 0 595.28 841.89' style='enable-background:new 0 0 595.28 841.89;' xml:space='preserve'>
318
- <style type='text/css'>
319
- #Layer_1_000000002 { fill:none } svg[id='Layer_1_000000002'] {
320
- fill:none } .st0{fill:none;stroke:#000000;stroke-miterlimit:10;}
321
- </style>
322
- <image/>
323
- <a xlink:href='mn://action_schema' xlink:dummy='Layer_1_000000002'>
324
- <rect x='123.28' y='273.93' class='st0' width='88.05' height='41.84'/>
325
- </a>
326
- <a xlink:href='http://www.example.com'>
327
- <rect x='324.69' y='450.52' class='st0' width='132.62' height='40.75'/>
328
- </a>
329
- <a xlink:href='mn://support_resource_schema'>
330
- <rect x='324.69' y='528.36' class='st0' width='148.16' height='40.75'/>
331
- </a>
332
- </svg>
333
- </figure>
334
- <target href="mn://support_resource_schema"><eref type="express" bibitemid="express_action_schema" citeas=""><localityStack><locality type="anchor"><referenceFrom>action_schema.basic</referenceFrom></locality></localityStack>Coffee</eref></target></svgmap></sections>
335
- </standard-document>
336
- OUTPUT
337
- end
338
-
339
- it "generates data uris" do
340
- expect(Metanorma::Utils.datauri("data:xyz")).to eq "data:xyz"
341
- expect(Metanorma::Utils.datauri("spec/fixtures/rice_image1.png")).to be_equivalent_to "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAGQCAYAAACAvzbMAAAABmJLR0QA/wD/AP+gvaeTAAAEzUlEQVR4nO3dz4tVZRzH8fedacogMCjHoiBop1RaOzF/QAv7QUIYZdCq/oQo+hdC10FRbVtVBC0r09y0iZAmoVwWRRaMBZlKnhZ3UlEwnVFnhvt6wQPnnnOeh8/m8r0P9zznKQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC42HT1RPVOdbT6c6Edrd5euDa9bOkAWJF2V3PVUA2jGtbfPG6jhXMLba56ahlzArBCTFf7q2GqhhfXNxzY3HB6R8Owc9xO72j4fHPDC7Pjexq3fZmNMOFGyx0Altn+6pV1Mw0fPtDo0bWXv/nLE7Xn24bjZxot9H31BmSEFUkBYZLtrj6+c6bhq0ca3X/rlXU6drK2fN3w27iIPF19ch0zwoqlgDCpbqqOTNWGgw/X/808LnZovnZ+U0N9Vz1Ynb0OGWFFm1ruALBMdlUb9q6/+uJRtf32en62qo2Nn86CiaOAMKmerXr5rsUP8NLd5w6fWXIaWIUUECbV1qqti5h9/Gfb+b7blpwGViEFhEl177qZumUJ34A1U3XHTFX3XKNMsKooIAAsigLCpPrx+Jk6tYRnp/4+W7+fqeqna5QJVhUFhEl1uOrwicUPcGj+/OGS08AqpIAwqT6oevfnxQ/w3i/nDj9achpYhSwkZFJNV0dGtfGLzeN1HVfjwHw9Nl5IOFc9lIWETCAzECbVP9XrQ7VnruHYySvv+MPJem6uYRh/fC3FgwnlbaJMsu+r2/4629b3f23YsrbRfWsu3+HgfO06cu49WPuqN29ATgBWoOnGhWCYqmHvbMNnmxpObT//OvdT2xs+3TS+dsHeIG/kBxgA1ZNdsKFUF2wo1aUbSj2+bCkBWJGmGheHtxoXij8W2tzCuV353xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAS/wLBh+fQNux/v8AAAAASUVORK5CYII="
342
- expect(Metanorma::Utils.datauri("rice_image1.png",
343
- "spec/fixtures")).to be_equivalent_to "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAGQCAYAAACAvzbMAAAABmJLR0QA/wD/AP+gvaeTAAAEzUlEQVR4nO3dz4tVZRzH8fedacogMCjHoiBop1RaOzF/QAv7QUIYZdCq/oQo+hdC10FRbVtVBC0r09y0iZAmoVwWRRaMBZlKnhZ3UlEwnVFnhvt6wQPnnnOeh8/m8r0P9zznKQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC42HT1RPVOdbT6c6Edrd5euDa9bOkAWJF2V3PVUA2jGtbfPG6jhXMLba56ahlzArBCTFf7q2GqhhfXNxzY3HB6R8Owc9xO72j4fHPDC7Pjexq3fZmNMOFGyx0Altn+6pV1Mw0fPtDo0bWXv/nLE7Xn24bjZxot9H31BmSEFUkBYZLtrj6+c6bhq0ca3X/rlXU6drK2fN3w27iIPF19ch0zwoqlgDCpbqqOTNWGgw/X/808LnZovnZ+U0N9Vz1Ynb0OGWFFm1ruALBMdlUb9q6/+uJRtf32en62qo2Nn86CiaOAMKmerXr5rsUP8NLd5w6fWXIaWIUUECbV1qqti5h9/Gfb+b7blpwGViEFhEl177qZumUJ34A1U3XHTFX3XKNMsKooIAAsigLCpPrx+Jk6tYRnp/4+W7+fqeqna5QJVhUFhEl1uOrwicUPcGj+/OGS08AqpIAwqT6oevfnxQ/w3i/nDj9achpYhSwkZFJNV0dGtfGLzeN1HVfjwHw9Nl5IOFc9lIWETCAzECbVP9XrQ7VnruHYySvv+MPJem6uYRh/fC3FgwnlbaJMsu+r2/4629b3f23YsrbRfWsu3+HgfO06cu49WPuqN29ATgBWoOnGhWCYqmHvbMNnmxpObT//OvdT2xs+3TS+dsHeIG/kBxgA1ZNdsKFUF2wo1aUbSj2+bCkBWJGmGheHtxoXij8W2tzCuV353xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAS/wLBh+fQNux/v8AAAAASUVORK5CYII="
344
- expect(Metanorma::Utils.datauri2mime("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAGQCAYAAACAvzbMAAAABmJLR0QA/wD/AP+gvaeTAAAEzUlEQVR4nO3dz4tVZRzH8fedacogMCjHoiBop1RaOzF/QAv7QUIYZdCq/oQo+hdC10FRbVtVBC0r09y0iZAmoVwWRRaMBZlKnhZ3UlEwnVFnhvt6wQPnnnOeh8/m8r0P9zznKQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC42HT1RPVOdbT6c6Edrd5euDa9bOkAWJF2V3PVUA2jGtbfPG6jhXMLba56ahlzArBCTFf7q2GqhhfXNxzY3HB6R8Owc9xO72j4fHPDC7Pjexq3fZmNMOFGyx0Altn+6pV1Mw0fPtDo0bWXv/nLE7Xn24bjZxot9H31BmSEFUkBYZLtrj6+c6bhq0ca3X/rlXU6drK2fN3w27iIPF19ch0zwoqlgDCpbqqOTNWGgw/X/808LnZovnZ+U0N9Vz1Ynb0OGWFFm1ruALBMdlUb9q6/+uJRtf32en62qo2Nn86CiaOAMKmerXr5rsUP8NLd5w6fWXIaWIUUECbV1qqti5h9/Gfb+b7blpwGViEFhEl177qZumUJ34A1U3XHTFX3XKNMsKooIAAsigLCpPrx+Jk6tYRnp/4+W7+fqeqna5QJVhUFhEl1uOrwicUPcGj+/OGS08AqpIAwqT6oevfnxQ/w3i/nDj9achpYhSwkZFJNV0dGtfGLzeN1HVfjwHw9Nl5IOFc9lIWETCAzECbVP9XrQ7VnruHYySvv+MPJem6uYRh/fC3FgwnlbaJMsu+r2/4629b3f23YsrbRfWsu3+HgfO06cu49WPuqN29ATgBWoOnGhWCYqmHvbMNnmxpObT//OvdT2xs+3TS+dsHeIG/kBxgA1ZNdsKFUF2wo1aUbSj2+bCkBWJGmGheHtxoXij8W2tzCuV353xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAS/wLBh+fQNux/v8AAAAASUVORK5CYII=")&.first&.to_s).to eq "image/png"
345
- expect(Metanorma::Utils.datauri("spec/fixtures/rice_image0.png")).to be_equivalent_to "spec/fixtures/rice_image0.png"
346
- expect{Metanorma::Utils.datauri("spec/fixtures/rice_image0.png")}.to output(%r{Image specified at `spec/fixtures/rice_image0\.png` does not exist\.}).to_stderr
347
- end
348
- end
data/spec/spec_helper.rb DELETED
@@ -1,42 +0,0 @@
1
- require "simplecov"
2
- SimpleCov.start do
3
- add_filter "/spec/"
4
- end
5
- require "rspec/matchers"
6
- require "equivalent-xml"
7
- require "metanorma-utils"
8
- require "rexml/document"
9
-
10
- RSpec.configure do |config|
11
- # Enable flags like --only-failures and --next-failure
12
- config.example_status_persistence_file_path = ".rspec_status"
13
-
14
- # Disable RSpec exposing methods globally on `Module` and `main`
15
- config.disable_monkey_patching!
16
-
17
- config.expect_with :rspec do |c|
18
- c.syntax = :expect
19
- end
20
- end
21
-
22
- class Dummy
23
- attr_accessor :id, :docfile
24
-
25
- def initialize(id = nil)
26
- @id = id
27
- end
28
-
29
- def attr(elem)
30
- case elem
31
- when "docfile" then @docfile
32
- end
33
- end
34
- end
35
-
36
- def xmlpp(xml)
37
- s = ""
38
- f = REXML::Formatters::Pretty.new(2)
39
- f.compact = true
40
- f.write(REXML::Document.new(xml), s)
41
- s
42
- end
data/spec/utils_spec.rb DELETED
@@ -1,232 +0,0 @@
1
- require "spec_helper"
2
- require "fileutils"
3
-
4
- RSpec.describe Metanorma::Utils do
5
- it "has a version number" do
6
- expect(Metanorma::Utils::VERSION).not_to be nil
7
- end
8
-
9
- it "capitalises" do
10
- expect(Metanorma::Utils.strict_capitalize_phrase("ABC def gHI"))
11
- .to eq "ABC Def GHI"
12
- expect(Metanorma::Utils.strict_capitalize_first("aBC def gHI"))
13
- .to eq "ABC def gHI"
14
- end
15
-
16
- it "converts OS-specific external path" do
17
- pwd = if !!((RUBY_PLATFORM =~ /(win|w)(32|64)$/) ||
18
- (RUBY_PLATFORM =~ /mswin|mingw/))
19
- `echo %cd%`
20
- else `pwd`
21
- end
22
- expect(Metanorma::Utils.external_path(FileUtils.pwd.strip)).to eq pwd.strip
23
- end
24
-
25
- it "applies Asciidoctor substitutions" do
26
- require "metanorma-standoc"
27
- expect(Metanorma::Utils.asciidoc_sub("A -- B"))
28
- .to eq "A&#8201;&#8212;&#8201;B"
29
- expect(Metanorma::Utils.asciidoc_sub("*A* stem:[x]"))
30
- .to eq "<strong>A</strong> <stem type=\"AsciiMath\">x</stem>"
31
- end
32
-
33
- it "finds file path of docfile" do
34
- d = Dummy.new
35
- expect(Metanorma::Utils.localdir(d)).to eq "./"
36
- d.docfile = "spec/utils_spec.rb"
37
- expect(Metanorma::Utils.localdir(d)).to eq "spec/"
38
- end
39
-
40
- it "applies smart formatting" do
41
- expect(Metanorma::Utils.smartformat("A - B A -- B A--B '80s '80' <A>"))
42
- .to eq "A — B A — B A—B ’80s ‘80’ &lt;A&gt;"
43
- end
44
-
45
- it "applies en-dash normalisation" do
46
- a = Nokogiri::XML(<<~INPUT)
47
- <container>
48
- <a>A -- B A - B</a>
49
- <b>A--B</b>
50
- </container>
51
- INPUT
52
- Metanorma::Utils.endash_date(a)
53
- expect(a.to_xml).to be_equivalent_to <<~OUTPUT
54
- <?xml version=\"1.0\"?>
55
- <container><a>A&#x2013;B A&#x2013;B</a><b>A&#x2013;B</b></container>
56
- OUTPUT
57
- end
58
-
59
- it "sets hash values by dotted key path" do
60
- a = {}
61
- a = Metanorma::Utils.set_nested_value(a, ["X"], "x")
62
- a = Metanorma::Utils.set_nested_value(a, ["X1"], 9)
63
- a = Metanorma::Utils.set_nested_value(a, ["X2"], [3])
64
- a = Metanorma::Utils.set_nested_value(a, ["X3"], { "a" => "b" })
65
- expect(a.to_s).to be_equivalent_to <<~OUTPUT
66
- {"X"=>"x", "X1"=>9, "X2"=>[3], "X3"=>{"a"=>"b"}}
67
- OUTPUT
68
- a = Metanorma::Utils.set_nested_value(a, ["X2"], 4)
69
- a = Metanorma::Utils.set_nested_value(a, ["X1"], 4)
70
- expect(a.to_s).to be_equivalent_to <<~OUTPUT
71
- {"X"=>"x", "X1"=>[9, 4], "X2"=>[3, 4], "X3"=>{"a"=>"b"}}
72
- OUTPUT
73
- a = Metanorma::Utils.set_nested_value(a, ["X2", "A"], 5)
74
- a = Metanorma::Utils.set_nested_value(a, ["X2a"], [])
75
- a = Metanorma::Utils.set_nested_value(a, ["X2a", "A"], 6)
76
- a = Metanorma::Utils.set_nested_value(a, ["X4", "A"], 10)
77
- a = Metanorma::Utils.set_nested_value(a, ["X3", "A"], 7)
78
- a = Metanorma::Utils.set_nested_value(a, ["X3", "a"], 8)
79
- a = Metanorma::Utils.set_nested_value(a, ["X1", "a"], 11)
80
- expect(a.to_s).to be_equivalent_to <<~OUTPUT
81
- {"X"=>"x", "X1"=>[9, 4, {"a"=>11}], "X2"=>[3, 4, {"A"=>5}], "X3"=>{"a"=>["b", 8], "A"=>7}, "X2a"=>[{"A"=>6}], "X4"=>{"A"=>10}}
82
- OUTPUT
83
- end
84
-
85
- it "maps languages to scripts" do
86
- expect(Metanorma::Utils.default_script("hi")).to eq "Deva"
87
- expect(Metanorma::Utils.rtl_script?(Metanorma::Utils.default_script("el")))
88
- .to eq false
89
- expect(Metanorma::Utils.rtl_script?(Metanorma::Utils.default_script("fa")))
90
- .to eq true
91
- end
92
-
93
- # not testing Asciidoctor log extraction here
94
- it "generates log" do
95
- xml = Nokogiri::XML(<<~INPUT)
96
- <xml>
97
- <a>
98
- <b>
99
- c
100
- </b></a></xml>
101
- INPUT
102
- FileUtils.rm_f("log.txt")
103
- log = Metanorma::Utils::Log.new
104
- log.add("Category 1", nil, "Message 1")
105
- log.add("Category 1", "node", "Message 2")
106
- log.add("Category 2", xml.at("//xml/a/b"), "Message 3")
107
- log.write("log.txt")
108
- expect(File.exist?("log.txt")).to be true
109
- file = File.read("log.txt", encoding: "utf-8")
110
- expect(file).to eq <<~OUTPUT
111
- log.txt errors
112
-
113
-
114
- == Category 1
115
-
116
- (): Message 1
117
- (node): Message 2
118
-
119
-
120
- == Category 2
121
-
122
- (XML Line 000003): Message 3
123
- <b>
124
- c
125
- </b>
126
- OUTPUT
127
- end
128
-
129
- it "deals with illegal characters in log" do
130
- FileUtils.rm_f("log.txt")
131
- log = Metanorma::Utils::Log.new
132
- log.add("Category 1", nil, "é\xc2")
133
- log.write("log.txt")
134
- expect(File.exist?("log.txt")).to be true
135
- file = File.read("log.txt", encoding: "utf-8")
136
- expect(file).to eq <<~OUTPUT
137
- log.txt errors
138
-
139
-
140
- == Category 1
141
-
142
- (): é�
143
- OUTPUT
144
- end
145
-
146
- it "parses CSV" do
147
- expect(Metanorma::Utils.csv_split("A;'B;C'")).to eq ["A", "'B", "C'"]
148
- expect(Metanorma::Utils.csv_split('A;"B;C"')).to eq ["A", "B;C"]
149
- expect(Metanorma::Utils.csv_split('A; "B;C"')).to eq ["A", "B;C"]
150
- expect(Metanorma::Utils.csv_split('A; "B;C"', ",")).to eq ['A; "B;C"']
151
- expect(Metanorma::Utils.csv_split('A, "B,C"', ",")).to eq ["A", "B,C"]
152
- end
153
-
154
- it "parses attributes from definition list" do
155
- xml = Nokogiri::XML(<<~INPUT)
156
- <xml>
157
- <dummy/>
158
- <dl>
159
- <dt>attr1</dt><dd>value1</dd>
160
- <dt>attr2</dt><dd><p>value1</p><p>value cont</p></dd>
161
- </xml>
162
- INPUT
163
- Metanorma::Utils.dl_to_attrs(xml.at("//dummy"), xml.at("//dl"), "attr1")
164
- Metanorma::Utils.dl_to_attrs(xml.at("//dummy"), xml.at("//dl"), "attr2")
165
- expect(xml.to_xml).to be_equivalent_to <<~OUTPUT
166
- <xml>
167
- <dummy attr1="value1" attr2="value1"/>
168
- <dl>
169
- <dt>attr1</dt><dd>value1</dd>
170
- <dt>attr2</dt><dd><p>value1</p><p>value cont</p></dd>
171
- </dl>
172
- </xml>
173
- OUTPUT
174
- end
175
-
176
- it "parses attributes from definition list" do
177
- xml = Nokogiri::XML(<<~INPUT)
178
- <xml>
179
- <dummy/>
180
- <dl>
181
- <dt>attr1</dt><dd>value1</dd>
182
- <dt>attr2</dt><dd><p>value1</p><p>value cont</p></dd>
183
- </xml>
184
- INPUT
185
- Metanorma::Utils.dl_to_attrs(xml.at("//dummy"), xml.at("//dl"), "attr1")
186
- Metanorma::Utils.dl_to_attrs(xml.at("//dummy"), xml.at("//dl"), "attr2")
187
- expect(xml.to_xml).to be_equivalent_to <<~OUTPUT
188
- <xml>
189
- <dummy attr1="value1" attr2="value1"/>
190
- <dl>
191
- <dt>attr1</dt><dd>value1</dd>
192
- <dt>attr2</dt><dd><p>value1</p><p>value cont</p></dd>
193
- </dl>
194
- </xml>
195
- OUTPUT
196
- end
197
-
198
- it "parses elements from definition list" do
199
- xml = Nokogiri::XML(<<~INPUT)
200
- <xml>
201
- <dummy>
202
- <attr2>A</attr2>
203
- <attr3>A</attr3>
204
- <attr2>A</attr2>
205
- </dummy>
206
- <dl>
207
- <dt>attr1</dt><dd>value1</dd>
208
- <dt>attr2</dt><dd><p>value1</p><p>value cont</p></dd>
209
- </dl>
210
- <dummy1/>
211
- </xml>
212
- INPUT
213
- Metanorma::Utils.dl_to_elems(xml.at("//dummy1"), xml.at("//dummy"),
214
- xml.at("//dl"), "attr1")
215
- Metanorma::Utils.dl_to_elems(xml.at("//dummy1"), xml.at("//dummy"),
216
- xml.at("//dl"), "attr2")
217
- expect(xml.to_xml).to be_equivalent_to <<~OUTPUT
218
- <xml>
219
- <dummy>
220
- <attr2>A</attr2>
221
- <attr3>A</attr3>
222
- <attr2>A</attr2><attr2><p>value1</p><p>value cont</p></attr2>
223
- </dummy>
224
- <dl>
225
- <dt>attr1</dt>
226
- <dt>attr2</dt>
227
- </dl>
228
- <dummy1/><attr1>value1</attr1>
229
- </xml>
230
- OUTPUT
231
- end
232
- end
data/spec/xml_spec.rb DELETED
@@ -1,75 +0,0 @@
1
- require "spec_helper"
2
- require "fileutils"
3
-
4
- RSpec.describe Metanorma::Utils do
5
- it "normalises anchors" do
6
- expect(Metanorma::Utils.to_ncname("/:ab")).to eq "__ab"
7
- expect(Metanorma::Utils.to_ncname("Löwe")).to eq "L__xf6_we"
8
- expect(Metanorma::Utils.to_ncname("Löwe", asciionly: false)).to eq "Löwe"
9
- expect(Metanorma::Utils.to_ncname("Löwe",
10
- asciionly: true)).to eq "L__xf6_we"
11
- end
12
-
13
- it "sets metanorma IDs if not provided" do
14
- uuid = /^_[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/
15
- expect(Metanorma::Utils.anchor_or_uuid)
16
- .to match (uuid)
17
- expect(Metanorma::Utils.anchor_or_uuid(Dummy.new(nil)))
18
- .to match (uuid)
19
- expect(Metanorma::Utils.anchor_or_uuid(Dummy.new("")))
20
- .to match (uuid)
21
- expect(Metanorma::Utils.anchor_or_uuid(Dummy.new("A"))).to eq "A"
22
- end
23
-
24
- it "generates XML snippets from Asciidoctor" do
25
- input = <<~'EOS'
26
- <A> &#150;
27
- EOS
28
-
29
- doc = (Asciidoctor::Document.new input.lines,
30
- { standalone: false }).parse
31
- out = Metanorma::Utils.noko do |xml|
32
- xml << doc.blocks.first.content
33
- end.join
34
- expect(out).to be_equivalent_to <<~OUTPUT
35
- &lt;A&gt; –
36
- OUTPUT
37
- end
38
-
39
- it "wraps an Asciidoctor node in paragraph" do
40
- input = <<~'EOS'
41
- NOTE: XYZ
42
- EOS
43
- input2 = <<~'EOS'
44
- ====
45
- A
46
-
47
- B
48
- ====
49
- EOS
50
-
51
- doc = (Asciidoctor::Document.new input.lines,
52
- { standalone: false }).parse
53
- doc2 = (Asciidoctor::Document.new input2.lines,
54
- { standalone: false }).parse
55
-
56
- out = Metanorma::Utils.noko do |xml|
57
- Metanorma::Utils.wrap_in_para(doc.blocks.first, xml)
58
- end.join
59
- expect(out).to be_equivalent_to <<~OUTPUT
60
- <p>XYZ</p>
61
- OUTPUT
62
- out = Metanorma::Utils.noko do |xml|
63
- Metanorma::Utils.wrap_in_para(doc2.blocks.first, xml)
64
- end.join
65
- expect(out).to be_equivalent_to <<~OUTPUT
66
- <div class="paragraph"><p>A</p></div><div class="paragraph"><p>B</p></div>
67
- OUTPUT
68
- end
69
-
70
- it "applies namespace to xpath" do
71
- expect(Metanorma::Utils.ns("//ab/Bb/c1-d[ancestor::c][d = 'x'][e/f]"))
72
- .to be_equivalent_to("//xmlns:ab/xmlns:Bb/xmlns:c1-d[ancestor::xmlns:c]"\
73
- "[xmlns:d = 'x'][xmlns:e/xmlns:f]")
74
- end
75
- end