metanorma-iso 1.10.6 → 2.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +26 -0
  3. data/Makefile +1 -1
  4. data/lib/asciidoctor/iso/base.rb +2 -69
  5. data/lib/asciidoctor/iso/cleanup.rb +2 -175
  6. data/lib/asciidoctor/iso/converter.rb +2 -17
  7. data/lib/asciidoctor/iso/deprecated.rb +5 -0
  8. data/lib/asciidoctor/iso/front.rb +2 -169
  9. data/lib/asciidoctor/iso/front_id.rb +2 -224
  10. data/lib/asciidoctor/iso/section.rb +2 -48
  11. data/lib/asciidoctor/iso/validate.rb +2 -171
  12. data/lib/asciidoctor/iso/validate_image.rb +2 -96
  13. data/lib/asciidoctor/iso/validate_requirements.rb +2 -110
  14. data/lib/asciidoctor/iso/validate_section.rb +2 -246
  15. data/lib/asciidoctor/iso/validate_style.rb +2 -169
  16. data/lib/asciidoctor/iso/validate_title.rb +2 -104
  17. data/lib/isodoc/iso/html/htmlstyle.css +47 -0
  18. data/lib/isodoc/iso/html/isodoc.css +1326 -0
  19. data/lib/isodoc/iso/html/isodoc.scss +0 -1
  20. data/lib/isodoc/iso/html/style-human.css +1015 -0
  21. data/lib/isodoc/iso/html/style-human.scss +8 -2
  22. data/lib/isodoc/iso/html/style-iso.css +1042 -0
  23. data/lib/isodoc/iso/html/style-iso.scss +9 -2
  24. data/lib/isodoc/iso/html/wordstyle.css +1701 -0
  25. data/lib/isodoc/iso/html_convert.rb +6 -4
  26. data/lib/isodoc/iso/iso.amendment.xsl +2142 -1565
  27. data/lib/isodoc/iso/iso.international-standard.xsl +2142 -1565
  28. data/lib/isodoc/iso/word_convert.rb +2 -0
  29. data/lib/metanorma/iso/base.rb +70 -0
  30. data/lib/{asciidoctor → metanorma}/iso/basicdoc.rng +5 -3
  31. data/lib/{asciidoctor → metanorma}/iso/biblio.rng +7 -5
  32. data/lib/{asciidoctor → metanorma}/iso/boilerplate-fr.xml +0 -0
  33. data/lib/{asciidoctor → metanorma}/iso/boilerplate.xml +0 -0
  34. data/lib/metanorma/iso/cleanup.rb +176 -0
  35. data/lib/metanorma/iso/converter.rb +18 -0
  36. data/lib/metanorma/iso/front.rb +170 -0
  37. data/lib/metanorma/iso/front_id.rb +225 -0
  38. data/lib/{asciidoctor → metanorma}/iso/isodoc.rng +98 -1
  39. data/lib/{asciidoctor → metanorma}/iso/isostandard-amd.rng +0 -0
  40. data/lib/{asciidoctor → metanorma}/iso/isostandard.rnc +0 -0
  41. data/lib/{asciidoctor → metanorma}/iso/isostandard.rng +0 -0
  42. data/lib/{asciidoctor → metanorma}/iso/reqt.rng +0 -0
  43. data/lib/metanorma/iso/section.rb +49 -0
  44. data/lib/metanorma/iso/validate.rb +172 -0
  45. data/lib/metanorma/iso/validate_image.rb +97 -0
  46. data/lib/metanorma/iso/validate_requirements.rb +111 -0
  47. data/lib/metanorma/iso/validate_section.rb +248 -0
  48. data/lib/metanorma/iso/validate_style.rb +170 -0
  49. data/lib/metanorma/iso/validate_title.rb +105 -0
  50. data/lib/metanorma/iso/version.rb +1 -1
  51. data/lib/metanorma-iso.rb +1 -1
  52. data/metanorma-iso.gemspec +1 -1
  53. data/spec/isodoc/ref_spec.rb +4 -2
  54. data/spec/isodoc/xref_spec.rb +18 -18
  55. data/spec/{asciidoctor → metanorma}/amd_spec.rb +1 -1
  56. data/spec/{asciidoctor → metanorma}/base_spec.rb +158 -197
  57. data/spec/{asciidoctor → metanorma}/blank_spec.rb +1 -1
  58. data/spec/{asciidoctor → metanorma}/blocks_spec.rb +1 -1
  59. data/spec/{asciidoctor → metanorma}/cleanup_spec.rb +1 -1
  60. data/spec/{asciidoctor → metanorma}/inline_spec.rb +1 -1
  61. data/spec/{asciidoctor → metanorma}/lists_spec.rb +1 -1
  62. data/spec/{asciidoctor → metanorma}/refs_spec.rb +2 -5
  63. data/spec/{asciidoctor → metanorma}/section_spec.rb +1 -1
  64. data/spec/{asciidoctor → metanorma}/table_spec.rb +1 -1
  65. data/spec/{asciidoctor → metanorma}/validate_spec.rb +28 -3
  66. data/spec/spec_helper.rb +1 -1
  67. metadata +46 -30
  68. data/spec/vcr_cassettes/docrels.yml +0 -393
  69. data/spec/vcr_cassettes/sortrefs.yml +0 -599
@@ -1,225 +1,3 @@
1
- require "date"
2
- require "nokogiri"
3
- require "htmlentities"
4
- require "json"
5
- require "pathname"
6
- require "open-uri"
7
- require "twitter_cldr"
1
+ require "asciidoctor/iso/deprecated"
2
+ require "metanorma/iso/front_id"
8
3
 
9
- module Asciidoctor
10
- module ISO
11
- class Converter < Standoc::Converter
12
- STAGE_ABBRS = {
13
- "00": "PWI",
14
- "10": "NP",
15
- "20": "WD",
16
- "30": "CD",
17
- "40": "DIS",
18
- "50": "FDIS",
19
- "60": "IS",
20
- "90": "(Review)",
21
- "95": "(Withdrawal)",
22
- }.freeze
23
-
24
- STAGE_NAMES = {
25
- "00": "Preliminary work item",
26
- "10": "New work item proposal",
27
- "20": "Working draft",
28
- "30": "Committee draft",
29
- "40": "Draft",
30
- "50": "Final draft",
31
- "60": "International standard",
32
- "90": "Review",
33
- "95": "Withdrawal",
34
- }.freeze
35
-
36
- def stage_abbr(stage, substage, doctype)
37
- return nil if stage.to_i > 60
38
-
39
- ret = STAGE_ABBRS[stage.to_sym]
40
- ret = "PRF" if stage == "60" && substage == "00"
41
- ret = "AWI" if stage == "10" && substage == "99"
42
- if %w(amendment technical-corrigendum technical-report
43
- technical-specification).include?(doctype)
44
- ret = "D" if stage == "40" && doctype == "amendment"
45
- ret = "FD" if stage == "50" && %w(amendment technical-corrigendum)
46
- .include?(doctype)
47
- end
48
- ret
49
- end
50
-
51
- def stage_name(stage, substage, _doctype, iteration = nil)
52
- return "Proof" if stage == "60" && substage == "00"
53
-
54
- ret = STAGE_NAMES[stage.to_sym]
55
- if iteration && %w(20 30).include?(stage)
56
- prefix = iteration.to_i.localize(@lang.to_sym)
57
- .to_rbnf_s("SpelloutRules", "spellout-ordinal")
58
- ret = "#{prefix.capitalize} #{ret.downcase}"
59
- end
60
- ret
61
- end
62
-
63
- def metadata_id(node, xml)
64
- iso_id(node, xml)
65
- node&.attr("tc-docnumber")&.split(/,\s*/)&.each do |n|
66
- xml.docidentifier(n, **attr_code(type: "iso-tc"))
67
- end
68
- xml.docnumber node&.attr("docnumber")
69
- end
70
-
71
- def iso_id(node, xml)
72
- (!@amd && node.attr("docnumber")) || (@amd && node.attr("updates")) or
73
- return
74
-
75
- dn = iso_id1(node)
76
- dn1 = id_stage_prefix(dn, node, false)
77
- dn2 = id_stage_prefix(dn, node, true)
78
- xml.docidentifier dn1, **attr_code(type: "ISO")
79
- xml.docidentifier(id_langsuffix(dn1, node),
80
- **attr_code(type: "iso-with-lang"))
81
- xml.docidentifier(id_langsuffix(dn2, node),
82
- **attr_code(type: "iso-reference"))
83
- end
84
-
85
- def iso_id1(node)
86
- if @amd
87
- dn = node.attr("updates")
88
- add_amd_parts(dn, node)
89
- else
90
- part, subpart = node&.attr("partnumber")&.split(/-/)
91
- add_id_parts(node.attr("docnumber"), part, subpart)
92
- end
93
- end
94
-
95
- def add_amd_parts(docnum, node)
96
- case doctype(node)
97
- when "amendment"
98
- "#{docnum}/Amd #{node.attr('amendment-number')}"
99
- when "technical-corrigendum"
100
- "#{docnum}/Cor.#{node.attr('corrigendum-number')}"
101
- end
102
- end
103
-
104
- def id_langsuffix(docnum, node)
105
- lang = node.attr("language") || "en"
106
- suffix = case lang
107
- when "en" then "(E)"
108
- when "fr" then "(F)"
109
- else
110
- "(X)"
111
- end
112
- "#{docnum}#{suffix}"
113
- end
114
-
115
- def structured_id(node, xml)
116
- return unless node.attr("docnumber")
117
-
118
- part, subpart = node&.attr("partnumber")&.split(/-/)
119
- xml.structuredidentifier do |i|
120
- i.project_number(node.attr("docnumber"), **attr_code(
121
- part: part, subpart: subpart,
122
- amendment: node.attr("amendment-number"),
123
- corrigendum: node.attr("corrigendum-number"),
124
- origyr: node.attr("created-date")
125
- ))
126
- end
127
- end
128
-
129
- def add_id_parts(docnum, part, subpart)
130
- docnum += "-#{part}" if part
131
- docnum += "-#{subpart}" if subpart
132
- docnum
133
- end
134
-
135
- def id_stage_abbr(stage, substage, node, bare = false)
136
- ret = id_stage_abbr1(stage, substage, node, bare)
137
- if %w(amendment technical-corrigendum technical-report
138
- technical-specification).include?(doctype(node)) &&
139
- !%w(D FD).include?(ret)
140
- ret = "#{ret} "
141
- end
142
- ret
143
- end
144
-
145
- def id_stage_abbr1(stage, substage, node, bare)
146
- if bare
147
- IsoDoc::Iso::Metadata.new("en", "Latn", @i18n)
148
- .status_abbrev(stage_abbr(stage, substage, doctype(node)),
149
- substage, nil, nil, doctype(node))
150
- else
151
- IsoDoc::Iso::Metadata.new("en", "Latn", @i18n)
152
- .status_abbrev(stage_abbr(stage, substage, doctype(node)),
153
- substage, node.attr("iteration"),
154
- node.attr("draft"), doctype(node))
155
- end
156
- end
157
-
158
- def cover_stage_abbr(node)
159
- stage = get_stage(node)
160
- abbr = id_stage_abbr(get_stage(node), get_substage(node), node, true)
161
- typeabbr = get_typeabbr(node, true)
162
- if stage.to_i > 50 || (stage.to_i == 60 && get_substage(node).to_i < 60)
163
- typeabbr = ""
164
- end
165
- "#{abbr}#{typeabbr}".strip
166
- end
167
-
168
- def id_stage_prefix(docnum, node, force_year)
169
- stage = get_stage(node)
170
- typeabbr = get_typeabbr(node)
171
- if stage && (stage.to_i < 60)
172
- docnum = unpub_stage_prefix(docnum, stage, typeabbr, node)
173
- elsif typeabbr == "DIR " then docnum = "#{typeabbr}#{docnum}"
174
- elsif typeabbr && !@amd then docnum = "/#{typeabbr}#{docnum}"
175
- end
176
- (force_year || !(stage && (stage.to_i < 60))) and
177
- docnum = id_add_year(docnum, node)
178
- docnum
179
- end
180
-
181
- def unpub_stage_prefix(docnum, stage, typeabbr, node)
182
- abbr = id_stage_abbr(stage, get_substage(node), node)
183
- %w(40 50).include?(stage) && i = node.attr("iteration") and
184
- itersuffix = ".#{i}"
185
- return docnum if abbr.nil? || abbr.empty? # prefixes added in cleanup
186
- return "/#{abbr}#{typeabbr} #{docnum}#{itersuffix}" unless @amd
187
-
188
- a = docnum.split(%r{/})
189
- a[-1] = "#{abbr}#{a[-1]}#{itersuffix}"
190
- a.join("/")
191
- end
192
-
193
- def id_add_year(docnum, node)
194
- year = node.attr("copyright-year")
195
- @amd and year ||= node.attr("updated-date")&.sub(/-.*$/, "")
196
- docnum += ":#{year}" if year
197
- docnum
198
- end
199
-
200
- def get_stage(node)
201
- a = node.attr("status")
202
- a = node.attr("docstage") if a.nil? || a.empty?
203
- a = "60" if a.nil? || a.empty?
204
- a
205
- end
206
-
207
- def get_substage(node)
208
- stage = get_stage(node)
209
- ret = node.attr("docsubstage")
210
- ret = (stage == "60" ? "60" : "00") if ret.nil? || ret.empty?
211
- ret
212
- end
213
-
214
- def get_typeabbr(node, amd = false)
215
- case doctype(node)
216
- when "directive" then "DIR "
217
- when "technical-report" then "TR "
218
- when "technical-specification" then "TS "
219
- when "amendment" then (amd ? "Amd " : "")
220
- when "technical-corrigendum" then (amd ? "Cor " : "")
221
- end
222
- end
223
- end
224
- end
225
- end
@@ -1,49 +1,3 @@
1
- require "htmlentities"
2
- require "uri" if /^2\./.match?(RUBY_VERSION)
1
+ require "asciidoctor/iso/deprecated"
2
+ require "metanorma/iso/section"
3
3
 
4
- module Asciidoctor
5
- module ISO
6
- class Converter < Standoc::Converter
7
- def clause_parse(attrs, xml, node)
8
- node.option? "appendix" and return appendix_parse(attrs, xml, node)
9
- super
10
- end
11
-
12
- def scope_parse(attrs, xml, node)
13
- attrs = attrs.merge(type: "scope") unless @amd
14
- clause_parse(attrs, xml, node)
15
- end
16
-
17
- def appendix_parse(attrs, xml, node)
18
- attrs[:"inline-header"] = node.option? "inline-header"
19
- set_obligation(attrs, node)
20
- xml.appendix **attr_code(attrs) do |xml_section|
21
- xml_section.title { |name| name << node.title }
22
- xml_section << node.content
23
- end
24
- end
25
-
26
- def patent_notice_parse(xml, node)
27
- # xml.patent_notice do |xml_section|
28
- # xml_section << node.content
29
- # end
30
- xml << node.content
31
- end
32
-
33
- def sectiontype(node, level = true)
34
- return nil if @amd
35
-
36
- ret = sectiontype_streamline(sectiontype1(node))
37
- return ret if ret == "terms and definitions" && @vocab
38
-
39
- super
40
- end
41
-
42
- def term_def_subclause_parse(attrs, xml, node)
43
- node.role == "term" and
44
- return term_def_subclause_parse1(attrs, xml, node)
45
- super
46
- end
47
- end
48
- end
49
- end
@@ -1,172 +1,3 @@
1
- require "metanorma-standoc"
2
- require_relative "./validate_style"
3
- require_relative "./validate_requirements"
4
- require_relative "./validate_section"
5
- require_relative "./validate_title"
6
- require_relative "./validate_image"
7
- require "nokogiri"
8
- require "jing"
9
- require "iev"
1
+ require "asciidoctor/iso/deprecated"
2
+ require "metanorma/iso/validate"
10
3
 
11
- module Asciidoctor
12
- module ISO
13
- class Converter < Standoc::Converter
14
- def isosubgroup_validate(root)
15
- root.xpath("//technical-committee/@type").each do |t|
16
- unless %w{TC PC JTC JPC}.include? t.text
17
- @log.add("Document Attributes", nil,
18
- "invalid technical committee type #{t}")
19
- end
20
- end
21
- root.xpath("//subcommittee/@type").each do |t|
22
- unless %w{SC JSC}.include? t.text
23
- @log.add("Document Attributes", nil,
24
- "invalid subcommittee type #{t}")
25
- end
26
- end
27
- end
28
-
29
- # ISO/IEC DIR 2, 15.5.3
30
- # does not deal with preceding text marked up
31
- def see_xrefs_validate(root)
32
- root.xpath("//xref").each do |t|
33
- preceding = t.at("./preceding-sibling::text()[last()]")
34
- next unless !preceding.nil? &&
35
- /\b(see| refer to)\s*\Z/mi.match(preceding)
36
-
37
- (target = root.at("//*[@id = '#{t['target']}']")) || next
38
- if target&.at("./ancestor-or-self::*[@obligation = 'normative']")
39
- @log.add("Style", t,
40
- "'see #{t['target']}' is pointing to a normative section")
41
- end
42
- end
43
- end
44
-
45
- # ISO/IEC DIR 2, 15.5.3
46
- def see_erefs_validate(root)
47
- root.xpath("//eref").each do |t|
48
- prec = t.at("./preceding-sibling::text()[last()]")
49
- next unless !prec.nil? && /\b(see|refer to)\s*\Z/mi.match(prec)
50
-
51
- unless target = root.at("//*[@id = '#{t['bibitemid']}']")
52
- @log.add("Bibliography", t,
53
- "'#{t} is not pointing to a real reference")
54
- next
55
- end
56
- target.at("./ancestor::references[@normative = 'true']") and
57
- @log.add("Style", t,
58
- "'see #{t}' is pointing to a normative reference")
59
- end
60
- end
61
-
62
- # ISO/IEC DIR 2, 10.4
63
- def locality_erefs_validate(root)
64
- root.xpath("//eref[descendant::locality]").each do |t|
65
- if /^(ISO|IEC)/.match?(t["citeas"]) &&
66
- !/: ?(\d+{4}|–)$/.match?(t["citeas"])
67
- @log.add("Style", t,
68
- "undated reference #{t['citeas']} should not contain "\
69
- "specific elements")
70
- end
71
- end
72
- end
73
-
74
- def termdef_warn(text, regex, elem, term, msg)
75
- regex.match(text) && @log.add("Style", elem, "#{term}: #{msg}")
76
- end
77
-
78
- # ISO/IEC DIR 2, 16.5.6
79
- def termdef_style(xmldoc)
80
- xmldoc.xpath("//term").each do |t|
81
- para = t.at("./definition/verbal-definition") || return
82
- term = t.at("./preferred//name").text
83
- termdef_warn(para.text, /\A(the|a)\b/i, t, term,
84
- "term definition starts with article")
85
- termdef_warn(para.text, /\.\Z/i, t, term,
86
- "term definition ends with period")
87
- end
88
- end
89
-
90
- def doctype_validate(xmldoc)
91
- doctype = xmldoc&.at("//bibdata/ext/doctype")&.text
92
- %w(international-standard technical-specification technical-report
93
- publicly-available-specification international-workshop-agreement
94
- guide amendment technical-corrigendum).include? doctype or
95
- @log.add("Document Attributes", nil,
96
- "#{doctype} is not a recognised document type")
97
- end
98
-
99
- def script_validate(xmldoc)
100
- script = xmldoc&.at("//bibdata/script")&.text
101
- script == "Latn" or
102
- @log.add("Document Attributes", nil,
103
- "#{script} is not a recognised script")
104
- end
105
-
106
- def stage_validate(xmldoc)
107
- stage = xmldoc&.at("//bibdata/status/stage")&.text
108
- %w(00 10 20 30 40 50 60 90 95).include? stage or
109
- @log.add("Document Attributes", nil,
110
- "#{stage} is not a recognised stage")
111
- end
112
-
113
- def substage_validate(xmldoc)
114
- substage = xmldoc&.at("//bibdata/status/substage")&.text or return
115
- %w(00 20 60 90 92 93 98 99).include? substage or
116
- @log.add("Document Attributes", nil,
117
- "#{substage} is not a recognised substage")
118
- end
119
-
120
- def iteration_validate(xmldoc)
121
- iteration = xmldoc&.at("//bibdata/status/iteration")&.text or return
122
- /^\d+/.match(iteration) or
123
- @log.add("Document Attributes", nil,
124
- "#{iteration} is not a recognised iteration")
125
- end
126
-
127
- def bibdata_validate(doc)
128
- doctype_validate(doc)
129
- script_validate(doc)
130
- stage_validate(doc)
131
- substage_validate(doc)
132
- iteration_validate(doc)
133
- end
134
-
135
- def content_validate(doc)
136
- super
137
- title_validate(doc.root)
138
- isosubgroup_validate(doc.root)
139
- onlychild_clause_validate(doc.root)
140
- termdef_style(doc.root)
141
- see_xrefs_validate(doc.root)
142
- see_erefs_validate(doc.root)
143
- locality_erefs_validate(doc.root)
144
- bibdata_validate(doc.root)
145
- bibitem_validate(doc.root)
146
- figure_validate(doc.root)
147
- end
148
-
149
- def bibitem_validate(xmldoc)
150
- xmldoc.xpath("//bibitem[date/on = '–']").each do |b|
151
- b.at("./note[@type = 'Unpublished-Status']") or
152
- @log.add("Style", b,
153
- "Reference #{b&.at('./@id')&.text} does not have an "\
154
- "associated footnote indicating unpublished status")
155
- end
156
- end
157
-
158
- def validate(doc)
159
- content_validate(doc)
160
- doctype = doc&.at("//bibdata/ext/doctype")&.text
161
- schema = case doctype
162
- when "amendment", "technical-corrigendum" # @amd
163
- "isostandard-amd.rng"
164
- else
165
- "isostandard.rng"
166
- end
167
- schema_validate(formattedstr_strip(doc.dup),
168
- File.join(File.dirname(__FILE__), schema))
169
- end
170
- end
171
- end
172
- end
@@ -1,97 +1,3 @@
1
- module Asciidoctor
2
- module ISO
3
- class Converter < Standoc::Converter
4
- # DRG directives 3.7; but anticipated by standoc
5
- def subfigure_validate(xmldoc)
6
- xmldoc.xpath("//figure//figure").each do |f|
7
- { footnote: "fn", note: "note", key: "dl" }.each do |k, v|
8
- f.xpath(".//#{v}").each do |n|
9
- @log.add("Style", n, "#{k} is not permitted in a subfigure")
10
- end
11
- end
12
- end
13
- end
1
+ require "asciidoctor/iso/deprecated"
2
+ require "metanorma/iso/validate_image"
14
3
 
15
- def image_name_prefix(xmldoc)
16
- std = xmldoc&.at("//bibdata/ext/structuredidentifier/project-number") or
17
- return
18
- num = xmldoc&.at("//bibdata/docnumber")&.text or return
19
- ed = xmldoc&.at("//bibdata/edition")&.text || "1"
20
- prefix = num
21
- std["part"] and prefix += "-#{std['part']}"
22
- prefix += "_ed#{ed}"
23
- amd = std["amendment"] and prefix += "amd#{amd}"
24
- prefix
25
- end
26
-
27
- def image_name_suffix(xmldoc)
28
- case xmldoc&.at("//bibdata/language")&.text
29
- when "fr" then "_f"
30
- when "de" then "_d"
31
- when "ru" then "_r"
32
- when "es" then "_s"
33
- when "ar" then "_a"
34
- # when "en" then "_e"
35
- else
36
- "_e"
37
- end
38
- end
39
-
40
- def disjunct_error(img, cond1, cond2, msg1, msg2)
41
- cond1 && !cond2 and
42
- @log.add("Style", img, "image name #{img['src']} #{msg1}")
43
- !cond1 && cond2 and
44
- @log.add("Style", img, "image name #{img['src']} #{msg2}")
45
- end
46
-
47
- def image_name_parse(img, prefix)
48
- m = %r[(SL)?#{prefix}fig(?<tab>Tab)?(?<annex>[A-Z])?(Text)?(?<num>\d+)
49
- (?<subfig>[a-z])?(?<key>_key\d+)?(?<lang>_[a-z])?$]x
50
- .match(File.basename(img["src"], ".*"))
51
- m.nil? and
52
- @log.add("Style", img,
53
- "image name #{img['src']} does not match DRG requirements")
54
- m
55
- end
56
-
57
- def image_name_validate1(i, prefix)
58
- m = image_name_parse(i, prefix) or return
59
- warn i["src"]
60
- disjunct_error(i, i.at("./ancestor::table"), !m[:tab].nil?,
61
- "is under a table but is not so labelled",
62
- "is labelled as under a table but is not")
63
- disjunct_error(i, i.at("./ancestor::annex"), !m[:annex].nil?,
64
- "is under an annex but is not so labelled",
65
- "is labelled as under an annex but is not")
66
- disjunct_error(i, i.xpath("./ancestor::figure").size > 1, !m[:subfig].nil?,
67
- "does not have a subfigure letter but is a subfigure",
68
- "has a subfigure letter but is not a subfigure")
69
- lang = image_name_suffix(i.document.root)
70
- (m[:lang] || "_e") == lang or
71
- @log.add("Style", i,
72
- "image name #{i['src']} expected to have suffix #{lang}")
73
- end
74
-
75
- # DRG directives 3.2
76
- def image_name_validate(xmldoc)
77
- prefix = image_name_prefix(xmldoc) or return
78
- xmldoc.xpath("//image").each do |i|
79
- next if i["src"].start_with?("data:")
80
-
81
- if /^ISO_\d+_/.match?(File.basename(i["src"]))
82
- elsif /^(SL)?#{prefix}fig/.match?(File.basename(i["src"]))
83
- image_name_validate1(i, prefix)
84
- else
85
- @log.add("Style", i,
86
- "image name #{i['src']} does not match DRG requirements: expect #{prefix}fig")
87
- end
88
- end
89
- end
90
-
91
- def figure_validate(xmldoc)
92
- image_name_validate(xmldoc)
93
- subfigure_validate(xmldoc)
94
- end
95
- end
96
- end
97
- end
@@ -1,111 +1,3 @@
1
- require "metanorma-standoc"
1
+ require "asciidoctor/iso/deprecated"
2
+ require "metanorma/iso/validate_requirements"
2
3
 
3
- module Asciidoctor
4
- module ISO
5
- class Converter < Standoc::Converter
6
- REQUIREMENT_RE_STR = <<~REGEXP.freeze
7
- \\b
8
- ( shall | (is|are)_to |
9
- (is|are)_required_(not_)?to |
10
- (is|are)_required_that |
11
- has_to |
12
- only\\b[^.,]+\\b(is|are)_permitted |
13
- it_is_necessary |
14
- (is|are)_not_(allowed | permitted |
15
- acceptable | permissible) |
16
- (is|are)_not_to_be |
17
- [.,:;]_do_not )
18
- \\b
19
- REGEXP
20
-
21
- def requirement_re
22
- Regexp.new(self.class::REQUIREMENT_RE_STR.gsub(/\s/, "")
23
- .gsub(/_/, "\\s"), Regexp::IGNORECASE)
24
- end
25
-
26
- def requirement_check(text)
27
- text.split(/\.\s+/).each do |t|
28
- return t if requirement_re.match t
29
- end
30
- nil
31
- end
32
-
33
- RECOMMENDATION_RE_STR = <<~REGEXP.freeze
34
- \\b
35
- should |
36
- ought_(not_)?to |
37
- it_is_(not_)?recommended_that
38
- \\b
39
- REGEXP
40
-
41
- def recommendation_re
42
- Regexp.new(self.class::RECOMMENDATION_RE_STR.gsub(/\s/, "")
43
- .gsub(/_/, "\\s"), Regexp::IGNORECASE)
44
- end
45
-
46
- def recommendation_check(text)
47
- text.split(/\.\s+/).each do |t|
48
- return t if recommendation_re.match t
49
- end
50
- nil
51
- end
52
-
53
- PERMISSION_RE_STR = <<~REGEXP.freeze
54
- \\b
55
- may |
56
- (is|are)_(permitted | allowed | permissible ) |
57
- it_is_not_required_that |
58
- no\\b[^.,]+\\b(is|are)_required
59
- \\b
60
- REGEXP
61
-
62
- def permission_re
63
- Regexp.new(self.class::PERMISSION_RE_STR.gsub(/\s/, "")
64
- .gsub(/_/, "\\s"), Regexp::IGNORECASE)
65
- end
66
-
67
- def permission_check(text)
68
- text.split(/\.\s+/).each do |t|
69
- return t if permission_re.match t
70
- end
71
- nil
72
- end
73
-
74
- POSSIBILITY_RE_STR = <<~REGEXP.freeze
75
- \\b
76
- can | cannot | be_able_to |
77
- there_is_a_possibility_of |
78
- it_is_possible_to | be_unable_to |
79
- there_is_no_possibility_of |
80
- it_is_not_possible_to
81
- \\b
82
- REGEXP
83
-
84
- def possibility_re
85
- Regexp.new(self.class::POSSIBILITY_RE_STR.gsub(/\s/, "")
86
- .gsub(/_/, "\\s"), Regexp::IGNORECASE)
87
- end
88
-
89
- def possibility_check(text)
90
- text.split(/\.\s+/).each { |t| return t if possibility_re.match t }
91
- nil
92
- end
93
-
94
- def external_constraint(text)
95
- text.split(/\.\s+/).each do |t|
96
- return t if /\b(must)\b/xi.match? t
97
- end
98
- nil
99
- end
100
-
101
- def style_no_guidance(node, text, docpart)
102
- r = requirement_check(text)
103
- style_warning(node, "#{docpart} may contain requirement", r) if r
104
- r = permission_check(text)
105
- style_warning(node, "#{docpart} may contain permission", r) if r
106
- r = recommendation_check(text)
107
- style_warning(node, "#{docpart} may contain recommendation", r) if r
108
- end
109
- end
110
- end
111
- end