metanorma-standoc 2.2.1.1 → 2.2.2.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 90287c74936b7e6fa5c54537833e425fdc78deb260ce3a9f083cc53530ad66fc
4
- data.tar.gz: 273eb7dcaf62e8b9a8578f932b3ab45377bdf0b57ad254cab80b16b10e584586
3
+ metadata.gz: 99fc70f6e9b8781722b3deed8143fabbadf28dfdda77f88e4ae9f7bfc3b83faf
4
+ data.tar.gz: 51305f5baa732cbb3b9df0ed6640413df408930365ef3ce8f84c16cad3337288
5
5
  SHA512:
6
- metadata.gz: 167db30a6cbf87a30f2e1d97eeaafffb63e94699a7f077556ec23604de443fcfabc1a1de091e7fbb93ddf528482e980e0b23c976abbf2e7aae8ebbfbddbb686c
7
- data.tar.gz: 1925f23438f2cc30fcd898c4ceeb8aea39442a8b0575d2cf8fa91954e229a2384b954670e75a66fe052486ff12a6b3394512d49ae84d38ac5f5253cde3591715
6
+ metadata.gz: b757363df3d4c399b067478880534eb0fad2b8cd166e4e0d0e33c138bb599f8f7ac8d017bbbe7500d59ee5f161ff6e43b0205362a6fcb0ba6d0dfa7444dbf7bd
7
+ data.tar.gz: add6f5d5626ee90828655bdf4feeb47091e362982dfe39372d0c85ff33efa21482b0f79ee4613b19ab438aae260c334bb3e15a3f3bf3eff2f80ed5486e888345
@@ -10,6 +10,6 @@ on:
10
10
 
11
11
  jobs:
12
12
  rake:
13
- uses: metanorma/metanorma-build-scripts/.github/workflows/plantuml-rake.yml@main
13
+ uses: metanorma/ci/.github/workflows/plantuml-rake.yml@main
14
14
  secrets:
15
15
  pat_token: ${{ secrets.METANORMA_CI_PAT_TOKEN }}
@@ -0,0 +1,24 @@
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
+
@@ -71,7 +71,7 @@ module Metanorma
71
71
  def init_reqt(node)
72
72
  @default_requirement_model = (node.attr("requirements-model") ||
73
73
  default_requirement_model)
74
- @reqt_models = Metanorma::Requirements
74
+ @reqt_models = requirements_processor
75
75
  .new({ default: @default_requirement_model })
76
76
  end
77
77
 
@@ -112,6 +112,10 @@ module Metanorma
112
112
  init_iev_caches(node)
113
113
  end
114
114
 
115
+ def requirements_processor
116
+ Metanorma::Requirements
117
+ end
118
+
115
119
  def document(node)
116
120
  ret = document1(node)
117
121
  clean_exit
@@ -156,8 +160,11 @@ module Metanorma
156
160
  end
157
161
 
158
162
  def clean_abort(msg, file = nil)
159
- file and
160
- File.open("#{@filename}.xml.abort", "w:UTF-8") { |f| f.write(file) }
163
+ if file
164
+ doc = file.to_xml(encoding: "UTF-8", indent: 2,
165
+ save_with: Nokogiri::XML::Node::SaveOptions::AS_XML)
166
+ File.open("#{@filename}.xml.abort", "w:UTF-8") { |f| f.write(doc) }
167
+ end
161
168
  clean_exit
162
169
  abort(msg)
163
170
  end
@@ -225,9 +225,9 @@
225
225
  <zeroOrMore>
226
226
  <ref name="forename"/>
227
227
  </zeroOrMore>
228
- <zeroOrMore>
229
- <ref name="initial"/>
230
- </zeroOrMore>
228
+ <optional>
229
+ <ref name="formatted-initials"/>
230
+ </optional>
231
231
  <ref name="surname"/>
232
232
  <zeroOrMore>
233
233
  <ref name="addition"/>
@@ -247,8 +247,8 @@
247
247
  <ref name="LocalizedString"/>
248
248
  </element>
249
249
  </define>
250
- <define name="initial">
251
- <element name="initial">
250
+ <define name="formatted-initials">
251
+ <element name="formatted-initials">
252
252
  <ref name="LocalizedString"/>
253
253
  </element>
254
254
  </define>
@@ -264,6 +264,9 @@
264
264
  </define>
265
265
  <define name="forename">
266
266
  <element name="forename">
267
+ <optional>
268
+ <attribute name="initial"/>
269
+ </optional>
267
270
  <ref name="LocalizedString"/>
268
271
  </element>
269
272
  </define>
@@ -84,8 +84,8 @@ module Metanorma
84
84
  dl = clause.at("./dl") or return
85
85
  key = ""
86
86
  bib = dl.xpath("./dt | ./dd").each_with_object({}) do |dtd, m|
87
- (dtd.name == "dt" and key = dtd.text.sub(/:+$/, "")) or
88
- add_to_hash(m, key, dd_bib_extract(dtd))
87
+ (dtd.name == "dt" and key = dtd.text.sub(/:+$/, "")) and next
88
+ add_to_hash(m, key, dd_bib_extract(dtd))
89
89
  end
90
90
  clause.xpath("./clause").each do |c1|
91
91
  key = c1&.at("./title")&.text&.downcase&.strip
@@ -3,7 +3,7 @@ module Metanorma
3
3
  module Cleanup
4
4
  def requirement_cleanup(xmldoc)
5
5
  @reqt_models ||=
6
- Metanorma::Requirements.new({ default: @default_requirement_model })
6
+ requirements_processor.new({ default: @default_requirement_model })
7
7
  @reqt_models.requirement_cleanup(xmldoc)
8
8
  end
9
9
  end
@@ -1,18 +1,17 @@
1
1
  require "asciidoctor"
2
- require "metanorma/util"
3
- require "metanorma/standoc/version"
4
- require "metanorma/standoc/base"
5
- require "metanorma/standoc/front"
6
- require "metanorma/standoc/lists"
7
- require "metanorma/standoc/ref"
8
- require "metanorma/standoc/inline"
9
- require "metanorma/standoc/blocks"
10
- require "metanorma/standoc/section"
11
- require "metanorma/standoc/table"
12
- require "metanorma/standoc/validate"
13
- require "metanorma/standoc/utils"
14
- require "metanorma/standoc/cleanup"
15
- require "metanorma/standoc/reqt"
2
+ require_relative "version"
3
+ require_relative "base"
4
+ require_relative "front"
5
+ require_relative "lists"
6
+ require_relative "ref"
7
+ require_relative "inline"
8
+ require_relative "blocks"
9
+ require_relative "section"
10
+ require_relative "table"
11
+ require_relative "validate"
12
+ require_relative "utils"
13
+ require_relative "cleanup"
14
+ require_relative "reqt"
16
15
  require_relative "./macros"
17
16
 
18
17
  module Metanorma
@@ -25,9 +24,6 @@ module Metanorma
25
24
  preprocessor Metanorma::Standoc::Datamodel::DiagramPreprocessor
26
25
  preprocessor Metanorma::Plugin::Datastruct::Json2TextPreprocessor
27
26
  preprocessor Metanorma::Plugin::Datastruct::Yaml2TextPreprocessor
28
- preprocessor Metanorma::Plugin::Lutaml::LutamlPreprocessor
29
- preprocessor Metanorma::Plugin::Lutaml::LutamlUmlAttributesTablePreprocessor
30
- preprocessor Metanorma::Plugin::Lutaml::LutamlUmlDatamodelDescriptionPreprocessor
31
27
  inline_macro Metanorma::Standoc::PreferredTermInlineMacro
32
28
  inline_macro Metanorma::Standoc::SpanInlineMacro
33
29
  inline_macro Metanorma::Standoc::AltTermInlineMacro
@@ -56,15 +52,11 @@ module Metanorma
56
52
  inline_macro Metanorma::Standoc::ToCInlineMacro
57
53
  inline_macro Metanorma::Standoc::PassInlineMacro
58
54
  inline_macro Metanorma::Standoc::StdLinkInlineMacro
59
- inline_macro Metanorma::Plugin::Lutaml::LutamlFigureInlineMacro
60
- inline_macro Metanorma::Plugin::Lutaml::LutamlTableInlineMacro
61
- block_macro Metanorma::Plugin::Lutaml::LutamlDiagramBlockMacro
62
55
  block Metanorma::Standoc::ToDoAdmonitionBlock
63
56
  block Metanorma::Standoc::EditorAdmonitionBlock
64
57
  treeprocessor Metanorma::Standoc::EditorInlineAdmonitionBlock
65
58
  treeprocessor Metanorma::Standoc::ToDoInlineAdmonitionBlock
66
59
  block Metanorma::Standoc::PlantUMLBlockMacro
67
- block Metanorma::Plugin::Lutaml::LutamlDiagramBlock
68
60
  block Metanorma::Standoc::PseudocodeBlockMacro
69
61
  preprocessor Metanorma::Standoc::EmbedIncludeProcessor
70
62
  preprocessor Metanorma::Standoc::NamedEscapePreprocessor
@@ -103,16 +103,16 @@ module Metanorma
103
103
  class ConceptInlineMacro < Asciidoctor::Extensions::InlineMacroProcessor
104
104
  use_dsl
105
105
  named :concept
106
- match /\{\{(?<content>|.*?[^\\])\}\}/
106
+ match /\{\{(?<content>|.*?[^\\])\}\}/m
107
107
  using_format :short
108
108
 
109
109
  def preprocess_attrs(target)
110
- m = /^(?<id>&lt;&lt;.+?&gt;&gt;)?(?<rest>.*)$/.match(target)
110
+ m = /^(?<id>&lt;&lt;.+?&gt;&gt;)?(?<rest>.*)$/m.match(target)
111
111
  ret = { id: m[:id]&.sub(/^&lt;&lt;/, "")&.sub(/&gt;&gt;$/, "") }
112
- if m2 = /^(?<rest>.*?)(?<opt>,opt(?:ion)?s=.+)$/
112
+ if m2 = /^(?<rest>.*?)(?<opt>,opt(?:ion)?s=.+)$/m
113
113
  .match(m[:rest].sub(/^,/, ""))
114
114
  ret[:opt] = CSV.parse_line(m2[:opt].sub(/^,opt(ion)?s=/, "")
115
- .sub(/^"(.+)"$/, "\\1").sub(/^'(.+)'$/, "\\1"))
115
+ .sub(/^"(.+)"$/m, "\\1").sub(/^'(.+)'$/m, "\\1"))
116
116
  begin
117
117
  attrs = CSV.parse_line(m2[:rest]) || []
118
118
  rescue StandardError
@@ -125,6 +125,7 @@ module Metanorma
125
125
  raise "error processing #{m[:rest]} as CSV"
126
126
  end
127
127
  end
128
+ attrs.map! { |x| x.gsub(/\s+/, " ") }
128
129
  ret.merge(term: attrs[0], word: attrs[1] || attrs[0],
129
130
  render: attrs[2])
130
131
  end
@@ -31,6 +31,13 @@ module Metanorma
31
31
  @reqt_model = nil unless nested
32
32
  ret
33
33
  end
34
+
35
+ def requirement_validate(docxml)
36
+ docxml.xpath("//requirement | //recommendation | //permission")
37
+ .each do |r|
38
+ @reqt_models.model(r["model"]).validate(r, @log)
39
+ end
40
+ end
34
41
  end
35
42
  end
36
43
  end
@@ -56,17 +56,23 @@ module Metanorma
56
56
  return nonterm_term_def_subclause_parse(attrs, xml, node)
57
57
  node.role == "boilerplate" and
58
58
  return terms_boilerplate_parse(attrs, xml, node)
59
- st = sectiontype(node, false)
60
- return symbols_parse(attrs, xml, node) if @definitions
61
-
62
- sub = node.find_by(context: :section) { |s| s.level == node.level + 1 }
63
- sub.empty? || (return term_def_parse(attrs, xml, node, false))
64
- st == "symbols and abbreviated terms" and
59
+ @definitions and return symbols_parse(attrs, xml, node)
60
+ term_contains_subclauses(node) and
61
+ return term_def_parse(attrs, xml, node, false)
62
+ case sectiontype(node, false)
63
+ when "symbols and abbreviated terms"
65
64
  return symbols_parse(attrs, xml, node)
66
- st == "terms and definitions" and return clause_parse(attrs, xml, node)
65
+ when "terms and definitions"
66
+ return clause_parse(attrs, xml, node)
67
+ end
67
68
  term_def_subclause_parse1(attrs, xml, node)
68
69
  end
69
70
 
71
+ def term_contains_subclauses(node)
72
+ sub = node.find_by(context: :section) { |s| s.level == node.level + 1 }
73
+ !sub.empty?
74
+ end
75
+
70
76
  def term_def_subclause_parse1(attrs, xml, node)
71
77
  xml.term **attr_code(attrs) do |xml_section|
72
78
  term_designation(xml_section, node, "preferred", node.title)
@@ -4,6 +4,8 @@ require_relative "./validate_table"
4
4
  require "nokogiri"
5
5
  require "jing"
6
6
  require "iev"
7
+ require "pngcheck"
8
+ require "png"
7
9
 
8
10
  module Metanorma
9
11
  module Standoc
@@ -51,7 +53,10 @@ module Metanorma
51
53
  concept_validate(doc, "concept", "refterm")
52
54
  concept_validate(doc, "related", "preferred//name")
53
55
  table_validate(doc)
54
- @fatalerror.empty? or clean_abort(@fatalerror.join("\n"), doc.to_xml)
56
+ requirement_validate(doc)
57
+ image_validate(doc)
58
+ @fatalerror.empty? or
59
+ clean_abort(@fatalerror.join("\n"), doc)
55
60
  end
56
61
 
57
62
  def norm_ref_validate(doc)
@@ -104,7 +109,7 @@ module Metanorma
104
109
  Tempfile.open(["tmp", ".xml"], encoding: "UTF-8") do |f|
105
110
  schema_validate1(f, doc, schema)
106
111
  rescue Jing::Error => e
107
- clean_abort("Jing failed with error: #{e}", doc.to_xml)
112
+ clean_abort("Jing failed with error: #{e}", doc)
108
113
  ensure
109
114
  f.close!
110
115
  end
@@ -154,6 +159,21 @@ module Metanorma
154
159
  end
155
160
  end
156
161
 
162
+ def image_validate(doc)
163
+ doc.xpath("//image[@mimetype = 'image/png']").each do |i|
164
+ d = Metanorma::Utils::datauri(i["src"], @localdir)
165
+ # d.chars.to_a.each_slice(80).to_a.map { |s| s.join }.each { |s| warn s }
166
+ png_validate1(i, Base64.strict_decode64(d.sub(/^.+?base64,/, "")))
167
+ end
168
+ end
169
+
170
+ def png_validate1(img, buffer)
171
+ PngCheck.check_buffer(buffer)
172
+ rescue PngCheck::CorruptPngError => e
173
+ @log.add("Images", img.parent, "Corrupt PNG image")
174
+ @fatalerror << "Exception #{e.message}"
175
+ end
176
+
157
177
  def validate(doc)
158
178
  content_validate(doc)
159
179
  schema_validate(formattedstr_strip(doc.dup),
@@ -19,6 +19,6 @@ module Metanorma
19
19
  end
20
20
 
21
21
  module Standoc
22
- VERSION = "2.2.1.1".freeze
22
+ VERSION = "2.2.2.2".freeze
23
23
  end
24
24
  end
@@ -4,7 +4,7 @@ require_relative "metanorma/standoc/converter"
4
4
  require_relative "metanorma/standoc/version"
5
5
  require "asciidoctor/extensions"
6
6
 
7
- if defined? Metanorma
7
+ if defined? Metanorma::Registry
8
8
  require_relative "metanorma/standoc"
9
9
  Metanorma::Registry.instance.register(Metanorma::Standoc::Processor)
10
10
  end
@@ -27,7 +27,8 @@ Gem::Specification.new do |spec|
27
27
 
28
28
  spec.add_dependency "asciidoctor", "~> 2.0.0"
29
29
  spec.add_dependency "iev", "~> 0.3.0"
30
- spec.add_dependency "isodoc", "~> 2.2.0"
30
+ spec.add_dependency "isodoc", "~> 2.2.3"
31
+ spec.add_dependency "metanorma"
31
32
  spec.add_dependency "metanorma-plugin-datastruct", "~> 0.2.0"
32
33
  spec.add_dependency "metanorma-plugin-lutaml"
33
34
  spec.add_dependency "ruby-jing"
@@ -36,7 +37,9 @@ Gem::Specification.new do |spec|
36
37
  spec.add_dependency "concurrent-ruby"
37
38
  spec.add_dependency "latexmath"
38
39
  spec.add_dependency "mathml2asciimath"
39
- spec.add_dependency "mn-requirements", "~> 0.0.1"
40
+ spec.add_dependency "mn-requirements", "~> 0.1.3"
41
+ spec.add_dependency "png"
42
+ spec.add_dependency "pngcheck"
40
43
  spec.add_dependency "relaton-cli", "~> 1.13.0"
41
44
  spec.add_dependency "relaton-iev", "~> 1.1.0"
42
45
  spec.add_dependency "unicode2latex", "~> 0.0.1"
@@ -45,7 +48,6 @@ Gem::Specification.new do |spec|
45
48
  spec.add_development_dependency "equivalent-xml", "~> 0.6"
46
49
  spec.add_development_dependency "guard", "~> 2.14"
47
50
  spec.add_development_dependency "guard-rspec", "~> 4.7"
48
- spec.add_development_dependency "metanorma-iso", "~>2.1.2"
49
51
  spec.add_development_dependency "rake", "~> 13.0"
50
52
  spec.add_development_dependency "rspec", "~> 3.6"
51
53
  spec.add_development_dependency "rubocop", "~> 1.5.2"
Binary file
Binary file
@@ -222,7 +222,7 @@ RSpec.describe Metanorma::Standoc do
222
222
  :iteration: 3
223
223
  :language: en
224
224
  :title: Main Title -- Title
225
- :library-ics: 1,2,3
225
+ :library-ics: 01.040.11,11.060.01
226
226
  :fullname: Fred Flintstone
227
227
  :role: author
228
228
  :affiliation: Slate Rock and Gravel Company
@@ -509,14 +509,13 @@ RSpec.describe Metanorma::Standoc do
509
509
  <technical-committee number="1" type="A">TC</technical-committee>
510
510
  <technical-committee number="11" type="A1">TC1</technical-committee>
511
511
  </editorialgroup>
512
- <ics>
513
- <code>1</code>
514
- </ics>
515
- <ics>
516
- <code>2</code>
512
+ <ics>
513
+ <code>01.040.11</code>
514
+ <text>Health care technology (Vocabularies)</text>
517
515
  </ics>
518
516
  <ics>
519
- <code>3</code>
517
+ <code>11.060.01</code>
518
+ <text>Dentistry in general</text>
520
519
  </ics>
521
520
  </ext>
522
521
  </bibdata>
@@ -6,6 +6,9 @@ RSpec.describe Metanorma::Standoc do
6
6
  #{ASCIIDOC_BLANK_HDR}
7
7
 
8
8
  {{clause1}}
9
+ {{clause two}}
10
+ {{clause
11
+ two}}
9
12
  term:[clause1]
10
13
  {{clause1,w\[o\]rd}}
11
14
  term:[clause1,w[o&#93;rd]
@@ -39,6 +42,22 @@ RSpec.describe Metanorma::Standoc do
39
42
  <tt>clause1</tt>
40
43
  </strong>
41
44
  </concept>
45
+ <concept>
46
+ <strong>
47
+ term
48
+ <tt>clause two</tt>
49
+ not resolved via ID
50
+ <tt>clause-two</tt>
51
+ </strong>
52
+ </concept>
53
+ <concept>
54
+ <strong>
55
+ term
56
+ <tt>clause two</tt>
57
+ not resolved via ID
58
+ <tt>clause-two</tt>
59
+ </strong>
60
+ </concept>
42
61
  <concept>
43
62
  <strong>
44
63
  term
@@ -933,102 +933,6 @@ RSpec.describe Metanorma::Standoc do
933
933
  .to be_equivalent_to xmlpp(output)
934
934
  end
935
935
 
936
- it "processes embed macro with document in a different flavour" do
937
- require "metanorma-iso"
938
- input = <<~INPUT
939
- #{ASCIIDOC_BLANK_HDR}
940
-
941
- [[clause1]]
942
- == Clause 1
943
-
944
- embed::spec/assets/iso.adoc[]
945
- INPUT
946
- output = <<~OUTPUT
947
- <standard-document xmlns='https://www.metanorma.org/ns/standoc' type='semantic' version='#{Metanorma::Standoc::VERSION}'>
948
- <bibdata type='standard'>
949
- <title language='en' format='text/plain'>Document title</title>
950
- <language>en</language>
951
- <script>Latn</script>
952
- <status>
953
- <stage>published</stage>
954
- </status>
955
- <copyright>
956
- <from>2022</from>
957
- </copyright>
958
- <ext>
959
- <doctype>standard</doctype>
960
- </ext>
961
- <relation type='derivedFrom'>
962
- <bibitem>
963
- <title language='en' format='text/plain' type='main'>
964
- Medical devices — Quality management systems — Requirements for
965
- regulatory purposes
966
- </title>
967
- <title language='en' format='text/plain' type='title-main'>
968
- Medical devices — Quality management systems — Requirements for
969
- regulatory purposes
970
- </title>
971
- <title language='fr' format='text/plain' type='main'>
972
- Dispositifs médicaux — Systèmes de management de la qualité —
973
- Exigences à des fins réglementaires
974
- </title>
975
- <title language='fr' format='text/plain' type='title-main'>
976
- Dispositifs médicaux — Systèmes de management de la qualité —
977
- Exigences à des fins réglementaires
978
- </title>
979
- <contributor>
980
- <role type='author'/>
981
- <organization>
982
- <name>International Organization for Standardization</name>
983
- <abbreviation>ISO</abbreviation>
984
- </organization>
985
- </contributor>
986
- <contributor>
987
- <role type='publisher'/>
988
- <organization>
989
- <name>International Organization for Standardization</name>
990
- <abbreviation>ISO</abbreviation>
991
- </organization>
992
- </contributor>
993
- <language>en</language>
994
- <script>Latn</script>
995
- <status>
996
- <stage abbreviation='IS'>60</stage>
997
- <substage>60</substage>
998
- </status>
999
- <copyright>
1000
- <from>2022</from>
1001
- <owner>
1002
- <organization>
1003
- <name>International Organization for Standardization</name>
1004
- <abbreviation>ISO</abbreviation>
1005
- </organization>
1006
- </owner>
1007
- </copyright>
1008
- <ext>
1009
- <doctype>standard</doctype>
1010
- <editorialgroup>
1011
- <agency>ISO</agency>
1012
- </editorialgroup>
1013
- <approvalgroup>
1014
- <agency>ISO</agency>
1015
- </approvalgroup>
1016
- <stagename>International standard</stagename>
1017
- </ext>
1018
- </bibitem>
1019
- </relation>
1020
- </bibdata>
1021
- <sections>
1022
- <clause id='clause1' inline-header='false' obligation='normative'>
1023
- <title>Clause 1</title>
1024
- </clause>
1025
- </sections>
1026
- </standard-document>
1027
- OUTPUT
1028
- expect(xmlpp(strip_guid(Asciidoctor.convert(input, *OPTIONS))))
1029
- .to be_equivalent_to xmlpp(output)
1030
- end
1031
-
1032
936
  it "processes std-link macro" do
1033
937
  VCR.use_cassette("std-link", match_requests_on: %i[method uri body]) do
1034
938
  input = <<~INPUT
@@ -782,4 +782,53 @@ RSpec.describe Metanorma::Standoc do
782
782
  expect(File.read("test.err"))
783
783
  .not_to include "Symbol reference in `symbol[xyz]` missing:"
784
784
  end
785
+
786
+ it "warns and aborts if corrupt PNG" do
787
+ FileUtils.rm_f "test.xml"
788
+ FileUtils.rm_f "test.err"
789
+ begin
790
+ input = <<~INPUT
791
+ = Document title
792
+ Author
793
+ :docfile: test.adoc
794
+ :no-pdf:
795
+
796
+ == Clause
797
+ image::spec/assets/corrupt.png[]
798
+
799
+ INPUT
800
+ expect do
801
+ Asciidoctor.convert(input, *OPTIONS)
802
+ end.to raise_error(SystemExit)
803
+ rescue SystemExit, RuntimeError
804
+ end
805
+ warn File.read("test.err")
806
+ expect(File.read("test.err"))
807
+ .to include "Corrupt PNG image"
808
+ expect(File.exist?("test.xml")).to be false
809
+ end
810
+
811
+ it "does not warn and abort if not corrupt PNG" do
812
+ FileUtils.rm_f "test.xml"
813
+ FileUtils.rm_f "test.err"
814
+ begin
815
+ input = <<~INPUT
816
+ = Document title
817
+ Author
818
+ :docfile: test.adoc
819
+ :no-pdf:
820
+
821
+ == Clause
822
+ image::spec/assets/correct.png[]
823
+
824
+ INPUT
825
+ expect do
826
+ Asciidoctor.convert(input, *OPTIONS)
827
+ end.not_to raise_error
828
+ rescue SystemExit, RuntimeError
829
+ end
830
+ expect(File.read("test.err"))
831
+ .not_to include "Corrupt PNG image"
832
+ expect(File.exist?("test.xml")).to be true
833
+ end
785
834
  end