metanorma-iso 1.5.12 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +18 -1
  3. data/lib/asciidoctor/iso/base.rb +5 -5
  4. data/lib/asciidoctor/iso/basicdoc.rng +52 -3
  5. data/lib/asciidoctor/iso/cleanup.rb +0 -6
  6. data/lib/asciidoctor/iso/front.rb +10 -5
  7. data/lib/asciidoctor/iso/isodoc.rng +51 -3
  8. data/lib/asciidoctor/iso/isostandard-amd.rng +8 -4
  9. data/lib/asciidoctor/iso/isostandard.rng +27 -10
  10. data/lib/asciidoctor/iso/validate.rb +78 -0
  11. data/lib/asciidoctor/iso/validate_section.rb +12 -9
  12. data/lib/isodoc/iso/base_convert.rb +2 -1
  13. data/lib/isodoc/iso/html/header.html +12 -12
  14. data/lib/isodoc/iso/html/html_iso_intro.html +1 -1
  15. data/lib/isodoc/iso/html/html_iso_titlepage.html +1 -1
  16. data/lib/isodoc/iso/html/htmlstyle.css +1 -1
  17. data/lib/isodoc/iso/html/htmlstyle.scss +1 -1
  18. data/lib/isodoc/iso/html/isodoc.css +42 -42
  19. data/lib/isodoc/iso/html/isodoc.scss +42 -42
  20. data/lib/isodoc/iso/html/style-human.css +9 -9
  21. data/lib/isodoc/iso/html/style-human.scss +7 -7
  22. data/lib/isodoc/iso/html/style-iso.css +7 -7
  23. data/lib/isodoc/iso/html/style-iso.scss +5 -5
  24. data/lib/isodoc/iso/html/word_iso_intro.html +1 -1
  25. data/lib/isodoc/iso/html/word_iso_titlepage.html +1 -1
  26. data/lib/isodoc/iso/html/wordstyle.css +67 -67
  27. data/lib/isodoc/iso/html/wordstyle.scss +67 -67
  28. data/lib/isodoc/iso/html_convert.rb +6 -2
  29. data/lib/isodoc/iso/i18n-en.yaml +2 -0
  30. data/lib/isodoc/iso/i18n-fr.yaml +1 -1
  31. data/lib/isodoc/iso/i18n-zh-Hans.yaml +1 -1
  32. data/lib/isodoc/iso/iso.amendment.xsl +276 -59
  33. data/lib/isodoc/iso/iso.international-standard.xsl +276 -59
  34. data/lib/isodoc/iso/metadata.rb +1 -0
  35. data/lib/isodoc/iso/sections.rb +1 -1
  36. data/lib/isodoc/iso/word_convert.rb +6 -2
  37. data/lib/isodoc/iso/xref.rb +34 -8
  38. data/lib/metanorma/iso/processor.rb +11 -9
  39. data/lib/metanorma/iso/version.rb +1 -1
  40. data/metanorma-iso.gemspec +2 -2
  41. data/spec/asciidoctor-iso/amd_spec.rb +14 -14
  42. data/spec/asciidoctor-iso/base_spec.rb +22 -20
  43. data/spec/asciidoctor-iso/blocks_spec.rb +22 -22
  44. data/spec/asciidoctor-iso/cleanup_spec.rb +32 -26
  45. data/spec/asciidoctor-iso/inline_spec.rb +7 -7
  46. data/spec/asciidoctor-iso/lists_spec.rb +9 -9
  47. data/spec/asciidoctor-iso/refs_spec.rb +5 -5
  48. data/spec/asciidoctor-iso/section_spec.rb +12 -7
  49. data/spec/asciidoctor-iso/table_spec.rb +4 -4
  50. data/spec/asciidoctor-iso/validate_spec.rb +455 -87
  51. data/spec/isodoc/amd_spec.rb +13 -13
  52. data/spec/isodoc/iso_spec.rb +2 -2
  53. data/spec/isodoc/metadata_spec.rb +2 -0
  54. data/spec/isodoc/section_spec.rb +20 -0
  55. data/spec/isodoc/xref_spec.rb +12 -0
  56. metadata +6 -12
  57. data/.github/workflows/macos.yml +0 -49
  58. data/.github/workflows/ubuntu.yml +0 -53
  59. data/.github/workflows/windows.yml +0 -50
  60. data/lib/asciidoctor/iso/macros.rb +0 -21
  61. data/lib/asciidoctor/iso/term_lookup_cleanup.rb +0 -86
  62. data/spec/asciidoctor-iso/macros_spec.rb +0 -310
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8fa41b9ff5a061ea7bf8428ec4cd1a692867c877462f4fd1b7bf1ae1b0dd2a9f
4
- data.tar.gz: 7e99d7041d2a295b48057be5ea7505ce05be4b40739ce4ffa3ffc4b94149aabc
3
+ metadata.gz: 4ec4ec662c484d537eb81f3942a322462babc6f46faa2a4842cb3dd0d933a23a
4
+ data.tar.gz: 1967914fa124dbe03b21d008f615bb84f576665bf7562d85ef4740bf56d953c3
5
5
  SHA512:
6
- metadata.gz: e7ee3745f439ae3aae5664e6440aed30d94f5e02b4691754fc39cc8ed58fa9bd8e8b80063d9d7889c4e36e8edc9e056f1bef761f471af4742bab8d8465d6a8d7
7
- data.tar.gz: a8f78935bf25b08a0cf56872384d0dcabd71d7ea8e996bf87d54db1f7045811b6e064953773b93d0d4f560a38f4fff16b4efd96814f01ac1eefbd4ae4e214d04
6
+ metadata.gz: bbd9e8c580bc90dc62eb14bee46daecd43519b76028f80bb13d7076ad34ce5f1ccfe6cac8159d13ecf08aa82c7afb4a8560ea1d74bd442e2387f03afe1ce0491
7
+ data.tar.gz: 240233e6a5eca387b2def2da7660524f28bb11ddbe6d5ee61b9cf829f1baf9ee547ecb411626efa52b8b129434d31e2228a2f7c4c30bacbcf336893ada0f239c
@@ -36,7 +36,10 @@ jobs:
36
36
  with:
37
37
  ruby-version: ${{ matrix.ruby }}
38
38
 
39
- - uses: actions/cache@v1
39
+ - if: matrix.os == 'macos-latest'
40
+ run: brew install autoconf automake libtool
41
+
42
+ - uses: actions/cache@v2
40
43
  with:
41
44
  path: vendor/bundle
42
45
  key: bundle-${{ matrix.os }}-${{ matrix.ruby }}-${{ hashFiles('**/*.gemspec') }}
@@ -64,3 +67,17 @@ jobs:
64
67
  run: cinst -y plantuml
65
68
 
66
69
  - run: bundle exec rake
70
+
71
+ tests-passed:
72
+ needs: rake
73
+ runs-on: ubuntu-latest
74
+ continue-on-error: true
75
+ steps:
76
+ - name: Trigger tests passed event
77
+ uses: Sibz/github-status-action@v1
78
+ with:
79
+ authToken: ${{ secrets.METANORMA_CI_PAT_TOKEN || secrets.GITHUB_TOKEN }}
80
+ context: 'tests-passed-successfully'
81
+ description: 'Tests passed successfully'
82
+ state: 'success'
83
+ sha: ${{ github.event.pull_request.head.sha || github.sha }}
@@ -5,7 +5,6 @@ require "pathname"
5
5
  require "open-uri"
6
6
  require "isodoc"
7
7
  require "fileutils"
8
- require 'asciidoctor/iso/macros'
9
8
 
10
9
  module Asciidoctor
11
10
  module ISO
@@ -13,10 +12,6 @@ module Asciidoctor
13
12
  XML_ROOT_TAG = "iso-standard".freeze
14
13
  XML_NAMESPACE = "https://www.metanorma.org/ns/iso".freeze
15
14
 
16
- Asciidoctor::Extensions.register do
17
- inline_macro Asciidoctor::Iso::TermRefInlineMacro
18
- end
19
-
20
15
  def html_converter(node)
21
16
  IsoDoc::Iso::HtmlConvert.new(html_extract_attributes(node))
22
17
  end
@@ -49,6 +44,11 @@ module Asciidoctor
49
44
  @amd = %w(amendment technical-corrigendum).include? doctype(node)
50
45
  end
51
46
 
47
+ def ol_attrs(node)
48
+ attr_code(keep_attrs(node).
49
+ merge(id: ::Metanorma::Utils::anchor_or_uuid(node)))
50
+ end
51
+
52
52
  def outputs(node, ret)
53
53
  File.open(@filename + ".xml", "w:UTF-8") { |f| f.write(ret) }
54
54
  presentation_xml_converter(node).convert(@filename + ".xml")
@@ -596,6 +596,7 @@
596
596
  <ref name="bookmark"/>
597
597
  <ref name="image"/>
598
598
  <ref name="index"/>
599
+ <ref name="index-xref"/>
599
600
  </choice>
600
601
  </define>
601
602
  <define name="PureTextElement">
@@ -728,13 +729,61 @@
728
729
  </define>
729
730
  <define name="index">
730
731
  <element name="index">
731
- <attribute name="primary"/>
732
732
  <optional>
733
- <attribute name="secondary"/>
733
+ <attribute name="to">
734
+ <data type="IDREF"/>
735
+ </attribute>
736
+ </optional>
737
+ <element name="primary">
738
+ <oneOrMore>
739
+ <ref name="PureTextElement"/>
740
+ </oneOrMore>
741
+ </element>
742
+ <optional>
743
+ <element name="secondary">
744
+ <oneOrMore>
745
+ <ref name="PureTextElement"/>
746
+ </oneOrMore>
747
+ </element>
748
+ </optional>
749
+ <optional>
750
+ <element name="tertiary">
751
+ <oneOrMore>
752
+ <ref name="PureTextElement"/>
753
+ </oneOrMore>
754
+ </element>
755
+ </optional>
756
+ </element>
757
+ </define>
758
+ <define name="index-xref">
759
+ <element name="index-xref">
760
+ <attribute name="also">
761
+ <data type="boolean"/>
762
+ </attribute>
763
+ <element name="primary">
764
+ <oneOrMore>
765
+ <ref name="PureTextElement"/>
766
+ </oneOrMore>
767
+ </element>
768
+ <optional>
769
+ <element name="secondary">
770
+ <oneOrMore>
771
+ <ref name="PureTextElement"/>
772
+ </oneOrMore>
773
+ </element>
734
774
  </optional>
735
775
  <optional>
736
- <attribute name="tertiary"/>
776
+ <element name="tertiary">
777
+ <oneOrMore>
778
+ <ref name="PureTextElement"/>
779
+ </oneOrMore>
780
+ </element>
737
781
  </optional>
782
+ <element name="target">
783
+ <oneOrMore>
784
+ <ref name="PureTextElement"/>
785
+ </oneOrMore>
786
+ </element>
738
787
  </element>
739
788
  </define>
740
789
  <!-- bare ID element, used for referencing arbitrary spans of text -->
@@ -4,7 +4,6 @@ require "htmlentities"
4
4
  require "json"
5
5
  require "pathname"
6
6
  require "open-uri"
7
- require "asciidoctor/iso/term_lookup_cleanup"
8
7
 
9
8
  module Asciidoctor
10
9
  module ISO
@@ -89,11 +88,6 @@ module Asciidoctor
89
88
  end
90
89
  end
91
90
 
92
- def termdef_cleanup(xmldoc)
93
- Asciidoctor::ISO::TermLookupCleanup.new(xmldoc, @log).call
94
- super
95
- end
96
-
97
91
  # TODO sort by authors
98
92
  # sort by: doc class (ISO, IEC, other standard (not DOI &c), other
99
93
  # then standard class (docid class other than DOI &c)
@@ -18,6 +18,11 @@ module Asciidoctor
18
18
  xml.updates_document_type a
19
19
  end
20
20
 
21
+ def metadata_doctype(node, xml)
22
+ xml.doctype doctype(node)
23
+ a = node.attr("horizontal") and xml.horizontal a
24
+ end
25
+
21
26
  def org_abbrev
22
27
  { "International Organization for Standardization" => "ISO",
23
28
  "International Electrotechnical Commission" => "IEC" }
@@ -80,27 +85,27 @@ module Asciidoctor
80
85
  def title_intro(node, t, lang, at)
81
86
  return unless node.attr("title-intro-#{lang}")
82
87
  t.title(**attr_code(at.merge(type: "title-intro"))) do |t1|
83
- t1 << Asciidoctor::Standoc::Utils::asciidoc_sub(node.attr("title-intro-#{lang}"))
88
+ t1 << Metanorma::Utils::asciidoc_sub(node.attr("title-intro-#{lang}"))
84
89
  end
85
90
  end
86
91
 
87
92
  def title_main(node, t, lang, at)
88
93
  t.title **attr_code(at.merge(type: "title-main")) do |t1|
89
- t1 << Asciidoctor::Standoc::Utils::asciidoc_sub(node.attr("title-main-#{lang}"))
94
+ t1 << Metanorma::Utils::asciidoc_sub(node.attr("title-main-#{lang}"))
90
95
  end
91
96
  end
92
97
 
93
98
  def title_part(node, t, lang, at)
94
99
  return unless node.attr("title-part-#{lang}")
95
100
  t.title(**attr_code(at.merge(type: "title-part"))) do |t1|
96
- t1 << Asciidoctor::Standoc::Utils::asciidoc_sub(node.attr("title-part-#{lang}"))
101
+ t1 << Metanorma::Utils::asciidoc_sub(node.attr("title-part-#{lang}"))
97
102
  end
98
103
  end
99
104
 
100
105
  def title_amd(node, t, lang, at)
101
106
  return unless node.attr("title-amendment-#{lang}")
102
107
  t.title(**attr_code(at.merge(type: "title-amd"))) do |t1|
103
- t1 << Asciidoctor::Standoc::Utils::asciidoc_sub(node.attr("title-amendment-#{lang}"))
108
+ t1 << Metanorma::Utils::asciidoc_sub(node.attr("title-amendment-#{lang}"))
104
109
  end
105
110
  end
106
111
 
@@ -113,7 +118,7 @@ module Asciidoctor
113
118
  title = "#{title} -- #{part}" if part
114
119
  title = "#{title} -- #{amd}" if amd && @amd
115
120
  t.title **attr_code(at.merge(type: "main")) do |t1|
116
- t1 << Asciidoctor::Standoc::Utils::asciidoc_sub(title)
121
+ t1 << Metanorma::Utils::asciidoc_sub(title)
117
122
  end
118
123
  end
119
124
 
@@ -55,6 +55,13 @@
55
55
  <param name="pattern">\i\c*|\c+#\c+</param>
56
56
  </data>
57
57
  </attribute>
58
+ <optional>
59
+ <attribute name="to">
60
+ <data type="string">
61
+ <param name="pattern">\i\c*|\c+#\c+</param>
62
+ </data>
63
+ </attribute>
64
+ </optional>
58
65
  <optional>
59
66
  <attribute name="type">
60
67
  <ref name="ReferenceFormat"/>
@@ -246,6 +253,12 @@
246
253
  <data type="boolean"/>
247
254
  </attribute>
248
255
  </optional>
256
+ <optional>
257
+ <attribute name="width"/>
258
+ </optional>
259
+ <optional>
260
+ <ref name="colgroup"/>
261
+ </optional>
249
262
  <optional>
250
263
  <ref name="tname"/>
251
264
  </optional>
@@ -764,6 +777,21 @@
764
777
  </define>
765
778
  </include>
766
779
  <!-- end overrides -->
780
+ <define name="colgroup">
781
+ <element name="colgroup">
782
+ <oneOrMore>
783
+ <ref name="col"/>
784
+ </oneOrMore>
785
+ </element>
786
+ </define>
787
+ <define name="col">
788
+ <element name="col">
789
+ <attribute name="width"/>
790
+ </element>
791
+ </define>
792
+ <define name="BibItemType" combine="choice">
793
+ <value>internal</value>
794
+ </define>
767
795
  <define name="TextElement" combine="choice">
768
796
  <ref name="concept"/>
769
797
  </define>
@@ -814,6 +842,9 @@
814
842
  <data type="boolean"/>
815
843
  </attribute>
816
844
  </optional>
845
+ <optional>
846
+ <attribute name="number"/>
847
+ </optional>
817
848
  <optional>
818
849
  <attribute name="obligation">
819
850
  <choice>
@@ -869,9 +900,11 @@
869
900
  <element name="code">
870
901
  <text/>
871
902
  </element>
872
- <element name="text">
873
- <text/>
874
- </element>
903
+ <optional>
904
+ <element name="text">
905
+ <text/>
906
+ </element>
907
+ </optional>
875
908
  </element>
876
909
  </define>
877
910
  <define name="standard-document">
@@ -1041,6 +1074,9 @@
1041
1074
  </choice>
1042
1075
  </attribute>
1043
1076
  </optional>
1077
+ <optional>
1078
+ <attribute name="number"/>
1079
+ </optional>
1044
1080
  <optional>
1045
1081
  <attribute name="type"/>
1046
1082
  </optional>
@@ -1094,6 +1130,9 @@
1094
1130
  <optional>
1095
1131
  <attribute name="type"/>
1096
1132
  </optional>
1133
+ <optional>
1134
+ <attribute name="number"/>
1135
+ </optional>
1097
1136
  <optional>
1098
1137
  <ref name="section-title"/>
1099
1138
  </optional>
@@ -1196,6 +1235,9 @@
1196
1235
  <optional>
1197
1236
  <attribute name="type"/>
1198
1237
  </optional>
1238
+ <optional>
1239
+ <attribute name="number"/>
1240
+ </optional>
1199
1241
  <optional>
1200
1242
  <attribute name="obligation">
1201
1243
  <choice>
@@ -1524,6 +1566,7 @@
1524
1566
  <value>add</value>
1525
1567
  <value>modify</value>
1526
1568
  <value>delete</value>
1569
+ <value>replace</value>
1527
1570
  </choice>
1528
1571
  </attribute>
1529
1572
  <optional>
@@ -1554,6 +1597,11 @@
1554
1597
  </optional>
1555
1598
  <optional>
1556
1599
  <element name="newcontent">
1600
+ <optional>
1601
+ <attribute name="id">
1602
+ <data type="ID"/>
1603
+ </attribute>
1604
+ </optional>
1557
1605
  <zeroOrMore>
1558
1606
  <ref name="BasicBlock"/>
1559
1607
  </zeroOrMore>
@@ -14,9 +14,6 @@
14
14
  </define>
15
15
  <define name="clause">
16
16
  <element name="clause">
17
- <optional>
18
- <attribute name="type"/>
19
- </optional>
20
17
  <optional>
21
18
  <attribute name="change">
22
19
  <choice>
@@ -34,6 +31,13 @@
34
31
  </define>
35
32
  <define name="iso-standard">
36
33
  <element name="iso-standard">
34
+ <attribute name="version"/>
35
+ <attribute name="type">
36
+ <choice>
37
+ <value>semantic</value>
38
+ <value>presentation</value>
39
+ </choice>
40
+ </attribute>
37
41
  <ref name="bibdata"/>
38
42
  <optional>
39
43
  <ref name="boilerplate"/>
@@ -68,7 +72,7 @@
68
72
  </optional>
69
73
  <optional>
70
74
  <attribute name="origyr">
71
- <data type="int"/>
75
+ <ref name="ISO8601Date"/>
72
76
  </attribute>
73
77
  </optional>
74
78
  <text/>
@@ -38,6 +38,9 @@
38
38
  </define>
39
39
  <define name="BibDataExtensionType">
40
40
  <ref name="doctype"/>
41
+ <optional>
42
+ <ref name="horizontal"/>
43
+ </optional>
41
44
  <ref name="editorialgroup"/>
42
45
  <zeroOrMore>
43
46
  <ref name="ics"/>
@@ -137,22 +140,28 @@
137
140
  </choice>
138
141
  </attribute>
139
142
  </optional>
143
+ <optional>
144
+ <attribute name="type"/>
145
+ </optional>
140
146
  <optional>
141
147
  <ref name="section-title"/>
142
148
  </optional>
143
- <choice>
144
- <group>
145
- <oneOrMore>
146
- <ref name="BasicBlock"/>
147
- </oneOrMore>
148
- <zeroOrMore>
149
- <ref name="note"/>
150
- </zeroOrMore>
151
- </group>
149
+ <group>
150
+ <choice>
151
+ <group>
152
+ <oneOrMore>
153
+ <ref name="BasicBlock"/>
154
+ </oneOrMore>
155
+ <zeroOrMore>
156
+ <ref name="note"/>
157
+ </zeroOrMore>
158
+ </group>
159
+ <ref name="amend"/>
160
+ </choice>
152
161
  <oneOrMore>
153
162
  <ref name="clause-subsection"/>
154
163
  </oneOrMore>
155
- </choice>
164
+ </group>
156
165
  </define>
157
166
  <define name="term">
158
167
  <element name="term">
@@ -379,6 +388,9 @@
379
388
  <data type="anyURI"/>
380
389
  </attribute>
381
390
  </optional>
391
+ <optional>
392
+ <ref name="colgroup"/>
393
+ </optional>
382
394
  <optional>
383
395
  <ref name="tname"/>
384
396
  </optional>
@@ -429,6 +441,11 @@
429
441
  <ref name="bibliography"/>
430
442
  </element>
431
443
  </define>
444
+ <define name="horizontal">
445
+ <element name="horizontal">
446
+ <data type="boolean"/>
447
+ </element>
448
+ </define>
432
449
  <define name="documentnumber">
433
450
  <element name="project-number">
434
451
  <optional>
@@ -146,6 +146,83 @@ module Asciidoctor
146
146
  "#{iteration} is not a recognised iteration")
147
147
  end
148
148
 
149
+ # DRG directives 3.7; but anticipated by standoc
150
+ def subfigure_validate(xmldoc)
151
+ xmldoc.xpath("//figure//figure").each do |f|
152
+ { footnote: "fn", note: "note", key: "dl" }.each do |k, v|
153
+ f.xpath(".//#{v}").each do |n|
154
+ @log.add("Style", n, "#{k} is not permitted in a subfigure")
155
+ end
156
+ end
157
+ end
158
+ end
159
+
160
+ def image_name_prefix(xmldoc)
161
+ std = xmldoc&.at("//bibdata/ext/structuredidentifier/project-number") or return
162
+ num = xmldoc&.at("//bibdata/docnumber")&.text or return
163
+ ed = xmldoc&.at("//bibdata/edition")&.text || "1"
164
+ prefix = num
165
+ part = std["part"] and prefix += "-#{std['part']}"
166
+ prefix += "_ed#{ed}"
167
+ amd = std["amendment"] and prefix += "amd#{amd}"
168
+ prefix
169
+ end
170
+
171
+ def image_name_suffix(xmldoc)
172
+ case xmldoc&.at("//bibdata/language")&.text
173
+ when "fr" then "_f"
174
+ when "de" then "_d"
175
+ when "ru" then "_r"
176
+ when "es" then "_s"
177
+ when "ar" then "_a"
178
+ when "en" then "_e"
179
+ else
180
+ "_e"
181
+ end
182
+ end
183
+
184
+ def disjunct_error(i, cond1, cond2, msg1, msg2)
185
+ cond1 && !cond2 and @log.add("Style", i, "image name #{i['src']} #{msg1}")
186
+ !cond1 && cond2 and @log.add("Style", i, "image name #{i['src']} #{msg2}")
187
+ end
188
+
189
+ def image_name_validate1(i, prefix)
190
+ m = %r[(SL)?#{prefix}fig(?<tab>Tab)?(?<annex>[A-Z])?(Text)?(?<num>\d+)
191
+ (?<subfig>[a-z])?(?<key>_key\d+)?(?<lang>_[a-z])?$]x.match(File.basename(i["src"], ".*"))
192
+ if m.nil?
193
+ @log.add("Style", i, "image name #{i['src']} does not match DRG requirements")
194
+ return
195
+ end
196
+ warn i['src']
197
+ disjunct_error(i, i.at("./ancestor::table"), !m[:tab].nil?,
198
+ "is under a table but is not so labelled", "is labelled as under a table but is not")
199
+ disjunct_error(i, i.at("./ancestor::annex"), !m[:annex].nil?,
200
+ "is under an annex but is not so labelled", "is labelled as under an annex but is not")
201
+ disjunct_error(i, i.xpath("./ancestor::figure").size > 1, !m[:subfig].nil?,
202
+ "does not have a subfigure letter but is a subfigure",
203
+ "has a subfigure letter but is not a subfigure")
204
+ lang = image_name_suffix(i.document.root)
205
+ (m[:lang] || "_e") == lang or @log.add("Style", i, "image name #{i['src']} expected to have suffix #{lang}")
206
+ end
207
+
208
+ # DRG directives 3.2
209
+ def image_name_validate(xmldoc)
210
+ prefix = image_name_prefix(xmldoc) or return
211
+ xmldoc.xpath("//image").each do |i|
212
+ if /^ISO_\d+_/.match(File.basename(i["src"]))
213
+ elsif /^(SL)?#{prefix}fig/.match(File.basename(i["src"]))
214
+ image_name_validate1(i, prefix)
215
+ else
216
+ @log.add("Style", i, "image name #{i['src']} does not match DRG requirements: expect #{prefix}fig")
217
+ end
218
+ end
219
+ end
220
+
221
+ def figure_validate(xmldoc)
222
+ image_name_validate(xmldoc)
223
+ subfigure_validate(xmldoc)
224
+ end
225
+
149
226
  def bibdata_validate(doc)
150
227
  doctype_validate(doc)
151
228
  script_validate(doc)
@@ -166,6 +243,7 @@ module Asciidoctor
166
243
  locality_erefs_validate(doc.root)
167
244
  bibdata_validate(doc.root)
168
245
  bibitem_validate(doc.root)
246
+ figure_validate(doc.root)
169
247
  end
170
248
 
171
249
  def bibitem_validate(xmldoc)