isodoc 2.1.5 → 2.2.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/isodoc.gemspec +5 -5
  3. data/lib/isodoc/class_utils.rb +1 -4
  4. data/lib/isodoc/convert.rb +56 -42
  5. data/lib/isodoc/function/inline.rb +12 -7
  6. data/lib/isodoc/function/references.rb +1 -1
  7. data/lib/isodoc/function/reqt.rb +17 -88
  8. data/lib/isodoc/function/section_titles.rb +3 -3
  9. data/lib/isodoc/function/table.rb +1 -1
  10. data/lib/isodoc/function/to_word_html.rb +7 -6
  11. data/lib/isodoc/function/utils.rb +4 -0
  12. data/lib/isodoc/init.rb +20 -0
  13. data/lib/isodoc/presentation_function/block.rb +23 -6
  14. data/lib/isodoc/presentation_function/image.rb +68 -19
  15. data/lib/isodoc/presentation_function/refs.rb +102 -0
  16. data/lib/isodoc/presentation_function/section.rb +1 -80
  17. data/lib/isodoc/presentation_function/terms.rb +9 -13
  18. data/lib/isodoc/presentation_xml_convert.rb +1 -0
  19. data/lib/isodoc/version.rb +1 -1
  20. data/lib/isodoc/word_function/postprocess.rb +1 -1
  21. data/lib/isodoc/xref/xref_counter.rb +12 -0
  22. data/lib/isodoc/xref/xref_gen.rb +17 -5
  23. data/lib/isodoc/xref/xref_gen_seq.rb +106 -81
  24. data/lib/isodoc/xref.rb +6 -0
  25. data/lib/isodoc-yaml/i18n-ar.yaml +0 -2
  26. data/lib/isodoc-yaml/i18n-de.yaml +0 -2
  27. data/lib/isodoc-yaml/i18n-en.yaml +9 -2
  28. data/lib/isodoc-yaml/i18n-es.yaml +0 -2
  29. data/lib/isodoc-yaml/i18n-fr.yaml +0 -2
  30. data/lib/isodoc-yaml/i18n-ru.yaml +0 -2
  31. data/lib/isodoc-yaml/i18n-zh-Hans.yaml +0 -2
  32. data/lib/relaton/render/general.rb +1 -18
  33. metadata +34 -26
  34. data/lib/isodoc/base_style/all.css +0 -227
  35. data/lib/isodoc/base_style/blocks.css +0 -0
  36. data/lib/isodoc/base_style/coverpage.css +0 -0
  37. data/lib/isodoc/base_style/defaults.css +0 -0
  38. data/lib/isodoc/base_style/metanorma_word.css +0 -47
  39. data/lib/isodoc/base_style/nav.css +0 -0
  40. data/lib/isodoc/base_style/reset.css +0 -125
  41. data/lib/isodoc/base_style/typography.css +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c0dec55aba65a594c5a4ef3916219976edb11e162aee6f806f05bc587466941a
4
- data.tar.gz: 47ef329be8d9b6aff1777820aa4901a74400888196227ea5dc08a218793e6f87
3
+ metadata.gz: 35faf26226ce9567b1cbe542ce0e2e5e9addaa4db63d88460a978b91e1aa7b1f
4
+ data.tar.gz: 3c6c08ee8a7b87edb3f4d17c5e1dd58e7b23081e3cce392a85404f8eafd3c280
5
5
  SHA512:
6
- metadata.gz: fd9d0f72fdef518808f6605953fa11d6033c5693a8851807b617bacc0d43315657ed80b8de93f0f46bcfb9d0529f327d647e00947234c5ebefa8666250b57ea9
7
- data.tar.gz: 3ef2cc2b5f97c2358e5e888865c8406ce66808e3fb7e62804646b71838ad748e372880ce359648dadd581bc36205e6d347aedbe220f2c9d6a1a7f5ee130d8055
6
+ metadata.gz: 2c1f5785099717614434d6099c2b6f843d24cb5e7de0cd2cfbfb4da5a42039bd790d90b91f270befd4fa6002f79509007024e2baf52803a5720d7f0d75433294
7
+ data.tar.gz: 05203b0d0f5092a7e0ab26659d8b8f6a7b8ed9d1a2d3a6ffa0d2cd06b94748d432c264978c32bbc0af391817af0046313782dfff74f840c8b14cfcc28992b466
data/isodoc.gemspec CHANGED
@@ -34,15 +34,15 @@ Gem::Specification.new do |spec|
34
34
  spec.add_dependency "asciimath"
35
35
  spec.add_dependency "html2doc", "~> 1.4.1"
36
36
  spec.add_dependency "htmlentities", "~> 4.3.4"
37
- spec.add_dependency "isodoc-i18n", "~> 1.0.0"
37
+ spec.add_dependency "isodoc-i18n", "~> 1.0.6"
38
38
  spec.add_dependency "liquid", "~> 4"
39
39
  # spec.add_dependency "metanorma", ">= 1.2.0"
40
40
  spec.add_dependency "emf2svg"
41
41
  spec.add_dependency "mathml2asciimath"
42
- spec.add_dependency "metanorma-utils"
43
-
42
+ spec.add_dependency "metanorma-utils", "~> 1.3.2"
43
+ spec.add_dependency "mn-requirements", "~> 0.1.2"
44
44
  spec.add_dependency "relaton-cli"
45
- spec.add_dependency "relaton-render", ">= 0.3.1"
45
+ spec.add_dependency "relaton-render", "~> 0.4.0"
46
46
  spec.add_dependency "roman-numerals"
47
47
  spec.add_dependency "thread_safe"
48
48
  spec.add_dependency "twitter_cldr", ">= 6.6.0"
@@ -52,7 +52,7 @@ Gem::Specification.new do |spec|
52
52
  spec.add_development_dependency "equivalent-xml", "~> 0.6"
53
53
  spec.add_development_dependency "guard", "~> 2.14"
54
54
  spec.add_development_dependency "guard-rspec", "~> 4.7"
55
- spec.add_development_dependency "metanorma-iso"
55
+ spec.add_development_dependency "metanorma-iso", ">= 2.1.7"
56
56
  spec.add_development_dependency "rake", "~> 13.0"
57
57
  spec.add_development_dependency "rexml"
58
58
  spec.add_development_dependency "rspec", "~> 3.6"
@@ -13,10 +13,7 @@ module IsoDoc
13
13
  end
14
14
 
15
15
  def ns(xpath)
16
- xpath.gsub(%r{/([a-zA-z])}, "/xmlns:\\1")
17
- .gsub(%r{::([a-zA-z])}, "::xmlns:\\1")
18
- .gsub(%r{\[([a-zA-z][a-z0-9A-Z@/]* ?=)}, "[xmlns:\\1")
19
- .gsub(%r{\[([a-zA-z][a-z0-9A-Z@/]*[/\[\]])}, "[xmlns:\\1")
16
+ Metanorma::Utils::ns(xpath)
20
17
  end
21
18
 
22
19
  def liquid(doc)
@@ -5,11 +5,13 @@ require "fileutils"
5
5
  require "tempfile"
6
6
  require_relative "i18n"
7
7
  require_relative "css"
8
+ require_relative "init"
8
9
  require "securerandom"
10
+ require "mn-requirements"
9
11
 
10
12
  module IsoDoc
11
13
  class Convert < ::IsoDoc::Common
12
- attr_accessor :options, :i18n, :meta, :xrefs
14
+ attr_accessor :options, :i18n, :meta, :xrefs, :reqt_models, :requirements_processor
13
15
 
14
16
  # htmlstylesheet: Generic stylesheet for HTML
15
17
  # htmlstylesheet_override: Override stylesheet for HTML
@@ -45,22 +47,28 @@ module IsoDoc
45
47
  # tocrecommendations: add ToC for rcommendations
46
48
  # fonts: fontist fonts to install
47
49
  # fontlicenseagreement: fontist font license agreement
48
- def initialize(options)
49
- @libdir ||= File.dirname(__FILE__) # rubocop:disable Lint/DisjunctiveAssignmentInConstructor
50
+ def initialize(options) # rubocop:disable Lint/MissingSuper
51
+ @options = options_preprocess(options)
52
+ init_stylesheets(@options)
53
+ init_covers(@options)
54
+ init_toc(@options)
55
+ init_fonts(@options)
56
+ init_processing
57
+ init_locations(@options)
58
+ init_i18n(@options)
59
+ init_rendering(@options)
60
+ end
61
+
62
+ def options_preprocess(options)
50
63
  options.merge!(default_fonts(options)) do |_, old, new|
51
64
  old || new
52
65
  end.merge!(default_file_locations(options)) do |_, old, new|
53
66
  old || new
54
67
  end
55
- @options = options
56
- @files_to_delete = []
57
- @tempfile_cache = []
58
- @sourcefilename = options[:sourcefilename]
59
- init_stylesheets(options)
60
- init_covers(options)
61
- init_toc(options)
62
- init_fonts(options)
63
- @i18nyaml = options[:i18nyaml]
68
+ options
69
+ end
70
+
71
+ def init_rendering(options)
64
72
  @ulstyle = options[:ulstyle]
65
73
  @olstyle = options[:olstyle]
66
74
  @datauriimage = options[:datauriimage]
@@ -69,6 +77,26 @@ module IsoDoc
69
77
  @sectionsplit = options[:sectionsplit] == "true"
70
78
  @suppressasciimathdup = options[:suppressasciimathdup] == "true"
71
79
  @bare = options[:bare]
80
+ @aligncrosselements = options[:aligncrosselements]
81
+ end
82
+
83
+ def init_i18n(options)
84
+ @i18nyaml = options[:i18nyaml]
85
+ @lang = options[:language] || "en"
86
+ @script = options[:script] || "Latn"
87
+ end
88
+
89
+ def init_locations(options)
90
+ @libdir ||= File.dirname(__FILE__)
91
+ @baseassetpath = options[:baseassetpath]
92
+ @tmpimagedir_suffix = tmpimagedir_suffix
93
+ @tmpfilesdir_suffix = tmpfilesdir_suffix
94
+ @sourcefilename = options[:sourcefilename]
95
+ @files_to_delete = []
96
+ @tempfile_cache = []
97
+ end
98
+
99
+ def init_processing
72
100
  @termdomain = ""
73
101
  @termexample = false
74
102
  @note = false
@@ -83,16 +111,10 @@ module IsoDoc
83
111
  @c = HTMLEntities.new
84
112
  @openmathdelim = "`"
85
113
  @closemathdelim = "`"
86
- @lang = options[:language] || "en"
87
- @script = options[:script] || "Latn"
88
114
  @maxwidth = 1200
89
115
  @maxheight = 800
90
116
  @bookmarks_allocated = { "X" => true }
91
117
  @fn_bookmarks = {}
92
- @baseassetpath = options[:baseassetpath]
93
- @aligncrosselements = options[:aligncrosselements]
94
- @tmpimagedir_suffix = tmpimagedir_suffix
95
- @tmpfilesdir_suffix = tmpfilesdir_suffix
96
118
  end
97
119
 
98
120
  def init_fonts(options)
@@ -150,6 +172,10 @@ module IsoDoc
150
172
  nil
151
173
  end
152
174
 
175
+ def requirements_processor
176
+ Metanorma::Requirements
177
+ end
178
+
153
179
  def convert1(docxml, filename, dir)
154
180
  @xrefs.parse docxml
155
181
  bibitem_lookup(docxml)
@@ -171,35 +197,25 @@ module IsoDoc
171
197
  end
172
198
  end
173
199
 
174
- def metadata_init(lang, script, i18n)
175
- @meta = Metadata.new(lang, script, i18n)
176
- end
177
-
178
- def xref_init(lang, script, _klass, i18n, options)
179
- html = HtmlConvert.new(language: @lang, script: @script)
180
- @xrefs = Xref.new(lang, script, html, i18n, options)
181
- end
182
-
183
- def i18n_init(lang, script, i18nyaml = nil)
184
- @i18n = I18n.new(lang, script, i18nyaml: i18nyaml || @i18nyaml)
185
- end
186
-
187
- def l10n(expr, lang = @lang, script = @script)
188
- @i18n.l10n(expr, lang, script)
189
- end
190
-
191
200
  def convert_init(file, input_filename, debug)
192
201
  docxml = Nokogiri::XML(file) { |config| config.huge }
193
202
  filename, dir = init_file(input_filename, debug)
194
203
  docxml.root.default_namespace = ""
195
- lang = docxml&.at(ns("//bibdata/language"))&.text and @lang = lang
196
- script = docxml&.at(ns("//bibdata/script"))&.text and @script = script
197
- i18n_init(@lang, @script)
204
+ convert_i18n_init(docxml)
198
205
  metadata_init(@lang, @script, @i18n)
199
206
  xref_init(@lang, @script, self, @i18n, {})
200
207
  [docxml, filename, dir]
201
208
  end
202
209
 
210
+ def convert_i18n_init(docxml)
211
+ lang = docxml&.at(ns("//bibdata/language"))&.text and @lang = lang
212
+ script = docxml&.at(ns("//bibdata/script"))&.text and @script = script
213
+ i18n_init(@lang, @script)
214
+ @reqt_models = requirements_processor
215
+ .new({ default: "default", lang: lang, script: script,
216
+ labels: @i18n.get })
217
+ end
218
+
203
219
  def convert(input_filename, file = nil, debug = false,
204
220
  output_filename = nil)
205
221
  file = File.read(input_filename, encoding: "utf-8") if file.nil?
@@ -219,10 +235,8 @@ module IsoDoc
219
235
  end
220
236
 
221
237
  def target_pdf(node)
222
- if /#/.match?(node["target"])
223
- node["target"].sub(/#/, ".pdf#")
224
- else
225
- "##{node['target']}"
238
+ if /#/.match?(node["target"]) then node["target"].sub(/#/, ".pdf#")
239
+ else "##{node['target']}"
226
240
  end
227
241
  end
228
242
  end
@@ -17,7 +17,13 @@ module IsoDoc
17
17
  def location_parse(node, out); end
18
18
 
19
19
  def span_parse(node, out)
20
- node.children.each { |n| parse(n, out) }
20
+ if node["style"]
21
+ out.span **{ style: node["style"] } do |s|
22
+ node.children.each { |n| parse(n, s) }
23
+ end
24
+ else
25
+ node.children.each { |n| parse(n, out) }
26
+ end
21
27
  end
22
28
 
23
29
  def callout_parse(node, out)
@@ -57,12 +63,11 @@ module IsoDoc
57
63
  def eref_url(bibitemid)
58
64
  return nil if @bibitems.nil? || @bibitems[bibitemid].nil?
59
65
 
60
- if url = @bibitems[bibitemid].at(ns("./uri[@type = 'citation']"))
61
- url.text
62
- elsif @bibitems[bibitemid]["hidden"] == "true"
63
- @bibitems[bibitemid]&.at(ns("./uri"))&.text
64
- else "##{bibitemid}"
65
- end
66
+ url = @bibitems[bibitemid].at(ns("./uri[@type = 'citation']")) and
67
+ return url.text
68
+ @bibitems[bibitemid]["hidden"] == "true" and
69
+ return @bibitems[bibitemid].at(ns("./uri"))&.text
70
+ "##{bibitemid}"
66
71
  end
67
72
 
68
73
  def eref_parse(node, out)
@@ -120,7 +120,7 @@ module IsoDoc
120
120
  def omit_docid_prefix(prefix)
121
121
  return true if prefix.nil? || prefix.empty?
122
122
 
123
- %w(ISO IEC IEV ITU W3C csd metanorma repository metanorma-ordinal)
123
+ %w(ISO IEC IEV ITU W3C BIPM csd metanorma repository metanorma-ordinal)
124
124
  .include? prefix
125
125
  end
126
126
 
@@ -1,121 +1,50 @@
1
1
  module IsoDoc
2
2
  module Function
3
3
  module Blocks
4
- def recommendation_labels(node)
5
- [node.at(ns("./label")), node.at(ns("./title")), node.at(ns("./name"))]
6
- end
7
-
8
- def recommendation_name(node, out, _type)
9
- label, title, lbl = recommendation_labels(node)
10
- out.p **{ class: "RecommendationTitle" } do |b|
11
- lbl&.children&.each { |n| parse(n, b) }
12
- b << l10n(":")
13
- if label || title
14
- b.br
15
- label&.children&.each { |n| parse(n, b) }
16
- b << "#{clausedelim} " if label && title
17
- title&.children&.each { |n| parse(n, b) }
18
- end
19
- end
20
- end
21
-
22
- def recommendation_attributes1(node)
23
- out = []
24
- oblig = node["obligation"] and
25
- out << l10n("#{@i18n.obligation}: #{oblig}")
26
- node.xpath(ns("./subject")).each do |subj|
27
- out << l10n("#{@i18n.subject}: #{subj.text}")
28
- end
29
- node.xpath(ns("./inherit")).each do |i|
30
- out << recommendation_attr_parse(i, @i18n.inherits)
31
- end
32
- node.xpath(ns("./classification")).each do |c|
33
- line = recommendation_attr_keyvalue(c, "tag", "value") and out << line
34
- end
35
- out
36
- end
37
-
38
- def recommendation_attr_parse(node, label)
39
- noko do |xml|
40
- xml << "#{label}: "
41
- node.children.each { |n| parse(n, xml) }
42
- end.join
43
- end
4
+ def recommendation_name(name, out)
5
+ return if name.nil?
44
6
 
45
- def recommendation_attr_keyvalue(node, key, value)
46
- tag = node.at(ns("./#{key}")) or return nil
47
- value = node.at(ns("./#{value}")) or return nil
48
- "#{tag.text.capitalize}: #{value.text}"
49
- end
50
-
51
- def recommendation_attributes(node, out)
52
- ret = recommendation_attributes1(node)
53
- return if ret.empty?
54
-
55
- out.p do |p|
56
- p.i do |i|
57
- i << ret.join("<br/>")
58
- end
7
+ out.p **{ class: "RecommendationTitle" } do |p|
8
+ name.children.each { |n| parse(n, p) }
59
9
  end
60
10
  end
61
11
 
62
- def reqt_metadata_node(node)
63
- %w(label title subject classification tag value
64
- inherit name).include? node.name
65
- end
66
-
67
12
  def reqt_attrs(node, klass)
68
13
  attr_code(class: klass, id: node["id"], style: keep_style(node))
69
14
  end
70
15
 
71
16
  def recommendation_parse(node, out)
72
17
  out.div **reqt_attrs(node, "recommend") do |t|
73
- recommendation_name(node, t, @i18n.recommendation)
74
- recommendation_attributes(node, out)
75
- node.children.each do |n|
76
- parse(n, t) unless reqt_metadata_node(n)
77
- end
18
+ recommendation_parse1(node, t)
19
+ end
20
+ end
21
+
22
+ def recommendation_parse1(node, out)
23
+ recommendation_name(node.at(ns("./name")), out)
24
+ node.children.each do |n|
25
+ parse(n, out) unless n.name == "name"
78
26
  end
79
27
  end
80
28
 
81
29
  def requirement_parse(node, out)
82
30
  out.div **reqt_attrs(node, "require") do |t|
83
- recommendation_name(node, t, @i18n.requirement)
84
- recommendation_attributes(node, out)
85
- node.children.each do |n|
86
- parse(n, t) unless reqt_metadata_node(n)
87
- end
31
+ recommendation_parse1(node, t)
88
32
  end
89
33
  end
90
34
 
91
35
  def permission_parse(node, out)
92
36
  out.div **reqt_attrs(node, "permission") do |t|
93
- recommendation_name(node, t, @i18n.permission)
94
- recommendation_attributes(node, out)
95
- node.children.each do |n|
96
- parse(n, t) unless reqt_metadata_node(n)
97
- end
37
+ recommendation_parse1(node, t)
98
38
  end
99
39
  end
100
40
 
101
- def reqt_component_attrs(node)
102
- klass = node.name
103
- klass == "component" and klass = node["class"]
104
- attr_code(class: "requirement-#{klass}",
105
- style: keep_style(node))
106
- end
107
-
108
- def requirement_component_parse(node, out)
109
- return if node["exclude"] == "true"
110
-
111
- out.div **reqt_component_attrs(node) do |div|
41
+ def div_parse(node, out)
42
+ out.div **reqt_attrs(node, node["type"]) do |t|
112
43
  node.children.each do |n|
113
- parse(n, div)
44
+ parse(n, t)
114
45
  end
115
46
  end
116
47
  end
117
-
118
- def requirement_skip_parse(node, out); end
119
48
  end
120
49
  end
121
50
  end
@@ -5,15 +5,15 @@ module IsoDoc
5
5
  "."
6
6
  end
7
7
 
8
- def clausedelimspace(out)
8
+ def clausedelimspace(_node, out)
9
9
  insert_tab(out, 1)
10
10
  end
11
11
 
12
- def inline_header_title(out, _node, title)
12
+ def inline_header_title(out, node, title)
13
13
  out.span **{ class: "zzMoveToFollowing" } do |s|
14
14
  s.b do |b|
15
15
  title&.children&.each { |c2| parse(c2, b) }
16
- clausedelimspace(out) if /\S/.match?(title&.text)
16
+ clausedelimspace(node, out) if /\S/.match?(title&.text)
17
17
  end
18
18
  end
19
19
  end
@@ -43,7 +43,7 @@ module IsoDoc
43
43
  width = node["width"] ? "width:#{node['width']};" : nil
44
44
  attr_code(
45
45
  id: node["id"],
46
- class: "MsoISOTable",
46
+ class: node["class"] || "MsoISOTable",
47
47
  style: "border-width:1px;border-spacing:0;"\
48
48
  "#{width}#{keep_style(node)}",
49
49
  title: node["alt"],
@@ -204,11 +204,12 @@ module IsoDoc
204
204
  when "requirement" then requirement_parse(node, out)
205
205
  when "recommendation" then recommendation_parse(node, out)
206
206
  when "permission" then permission_parse(node, out)
207
- when "subject", "classification"
208
- requirement_skip_parse(node, out)
209
- when "inherit", "description", "specification", "measurement-target",
210
- "verification", "import", "component"
211
- requirement_component_parse(node, out)
207
+ when "div" then div_parse(node, out)
208
+ #when "subject", "classification"
209
+ # requirement_skip_parse(node, out)
210
+ #when "inherit", "description", "specification", "measurement-target",
211
+ #"verification", "import", "component"
212
+ # requirement_component_parse(node, out)
212
213
  when "index" then index_parse(node, out)
213
214
  when "index-xref" then index_xref_parse(node, out)
214
215
  when "termref" then termrefelem_parse(node, out)
@@ -218,7 +219,7 @@ module IsoDoc
218
219
  when "feedback-statement" then feedback_parse(node, out)
219
220
  when "passthrough" then passthrough_parse(node, out)
220
221
  when "amend" then amend_parse(node, out)
221
- when "tab" then clausedelimspace(out) # in Presentation XML only
222
+ when "tab" then clausedelimspace(node, out) # in Presentation XML only
222
223
  when "svg" then svg_parse(node, out) # in Presentation XML only
223
224
  when "add" then add_parse(node, out)
224
225
  when "del" then del_parse(node, out)
@@ -222,6 +222,10 @@ module IsoDoc
222
222
  application/x-msmetafile image/x-xbitmap).include? type
223
223
  end
224
224
 
225
+ def eps?(type)
226
+ %w(application/postscript image/x-eps).include? type
227
+ end
228
+
225
229
  def cleanup_entities(text, is_xml: true)
226
230
  c = HTMLEntities.new
227
231
  if is_xml
@@ -0,0 +1,20 @@
1
+ module IsoDoc
2
+ class Convert < ::IsoDoc::Common
3
+ def metadata_init(lang, script, i18n)
4
+ @meta = Metadata.new(lang, script, i18n)
5
+ end
6
+
7
+ def xref_init(lang, script, _klass, i18n, options)
8
+ html = HtmlConvert.new(language: @lang, script: @script)
9
+ @xrefs = Xref.new(lang, script, html, i18n, options)
10
+ end
11
+
12
+ def i18n_init(lang, script, i18nyaml = nil)
13
+ @i18n = I18n.new(lang, script, i18nyaml: i18nyaml || @i18nyaml)
14
+ end
15
+
16
+ def l10n(expr, lang = @lang, script = @script)
17
+ @i18n.l10n(expr, lang, script)
18
+ end
19
+ end
20
+ end
@@ -45,7 +45,6 @@ module IsoDoc
45
45
  end
46
46
  end
47
47
 
48
- # introduce name element
49
48
  def formula1(elem)
50
49
  lbl = @xrefs.anchor(elem["id"], :label, false)
51
50
  prefix_name(elem, "", lbl, "name")
@@ -73,7 +72,6 @@ module IsoDoc
73
72
  end
74
73
  end
75
74
 
76
- # introduce name element
77
75
  def note1(elem)
78
76
  return if elem.parent.name == "bibitem" || elem["notag"] == "true"
79
77
 
@@ -116,11 +114,10 @@ module IsoDoc
116
114
  end
117
115
  end
118
116
 
119
- # introduce name element
120
117
  def recommendation1(elem, type)
121
- n = @xrefs.anchor(elem["id"], :label, false)
122
- lbl = (n.nil? ? type : l10n("#{type} #{n}"))
123
- prefix_name(elem, "", lbl, "name")
118
+ lbl = @reqt_models.model(elem["model"])
119
+ .recommendation_label(elem, type, xrefs)
120
+ prefix_name(elem, "", l10n(lbl), "name")
124
121
  end
125
122
 
126
123
  def table(docxml)
@@ -175,5 +172,25 @@ module IsoDoc
175
172
  def ol1(elem)
176
173
  elem["type"] ||= ol_depth(elem).to_s
177
174
  end
175
+
176
+ def requirement_render_preprocessing(docxml); end
177
+
178
+ REQS = %w(requirement recommendation permission).freeze
179
+
180
+ def requirement_render(docxml)
181
+ requirement_render_preprocessing(docxml)
182
+ REQS.each do |x|
183
+ REQS.each do |y|
184
+ docxml.xpath(ns("//#{x}//#{y}")).each { |r| requirement_render1(r) }
185
+ end
186
+ end
187
+ docxml.xpath(ns("//requirement | //recommendation | //permission"))
188
+ .each { |r| requirement_render1(r) }
189
+ end
190
+
191
+ def requirement_render1(node)
192
+ node.replace(@reqt_models.model(node["model"])
193
+ .requirement_render1(node))
194
+ end
178
195
  end
179
196
  end